字符串和数值之前转换,是一个经常碰到的类型转换。
之前字符数组用的多,std::string的这次用到了,还是有点区别,这里提供C++和C的两种方式供参考:
优缺点:C++的stringstream智能扩展,不用考虑字符数组长度等..;但C的性能高
有性能要求的推荐用C实现版本。
上测试实例:
1 #include2 #include 3 #include 4 #include 5 6 using namespace std; 7 int main() 8 { 9 //C++ method10 {11 //int -- string 12 stringstream stream;13 14 15 stream.clear(); //在进行多次转换前,必须清除stream16 int iValue = 1000;17 string sResult;18 stream << iValue; //将int输入流19 stream >> sResult; //从stream中抽取前面插入的int值20 cout << sResult << endl; // print the string21 22 //string -- int 23 stream.clear(); //在进行多次转换前,必须清除stream24 string sValue="13579";25 int iResult;26 stream<< sValue; //插入字符串27 stream >> iResult; //转换成int28 cout << iResult << endl;29 }30 31 //C method32 {33 //int -- string(C) 134 int iValueC=19000;35 char cArray[10]="";//需要通过字符数组中转36 string sResultC;37 //itoa由于它不是标准C语言函数,不能在所有的编译器中使用,这里用标准的sprintf38 sprintf(cArray, "%d", iValueC);39 sResultC=cArray; 40 cout< < > 后文附实现46 sResultC2=itoa(iValueC2); 47 cout< <
如下是网上找到的一片比较经典的itoa实现!
1 #define INT_DIGITS 19 /* enough for 64 bit integer */ 2 3 char *itoa(int i) 4 { 5 /* Room for INT_DIGITS digits, - and '\0' */ 6 static char buf[INT_DIGITS + 2]; 7 char *p = buf + INT_DIGITS + 1; /* points to terminating '\0' */ 8 if (i >= 0) { 9 do {10 *--p = '0' + (i % 10);11 i /= 10;12 } while (i != 0);13 return p;14 }15 else { /* i < 0 */16 do {17 *--p = '0' - (i % 10);18 i /= 10;19 } while (i != 0);20 *--p = '-';21 }22 return p;23 }