字符串和数值之前转换,是一个经常碰到的类型转换。
之前字符数组用的多,std::string的这次用到了,还是有点区别,这里提供C++和C的两种方式供参考:
优缺点:C++的stringstream智能扩展,不用考虑字符数组长度等..;但C的性能高
有性能要求的推荐用C实现版本。
上测试实例:

1 #include <iostream> 2 #include <cstdlib> 3 #include <string> 4 #include <sstream> 5 6 using namespace std; 7 int main() 8 { 9 //C++ method 10 { 11 //int -- string 12 stringstream stream; 13 14 15 stream.clear(); //在进行多次转换前,必须清除stream 16 int iValue = 1000; 17 string sResult; 18 stream << iValue; //将int输入流 19 stream >> sResult; //从stream中抽取前面插入的int值 20 cout << sResult << endl; // print the string 21 22 //string -- int 23 stream.clear(); //在进行多次转换前,必须清除stream 24 string sValue="13579"; 25 int iResult; 26 stream<< sValue; //插入字符串 27 stream >> iResult; //转换成int 28 cout << iResult << endl; 29 } 30 31 //C method 32 { 33 //int -- string(C) 1 34 int iValueC=19000; 35 char cArray[10]="";//需要通过字符数组中转 36 string sResultC; 37 //itoa由于它不是标准C语言函数,不能在所有的编译器中使用,这里用标准的sprintf 38 sprintf(cArray, "%d", iValueC); 39 sResultC=cArray; 40 cout<<sResultC<<endl; 41 42 //int -- string(C) 2 43 int iValueC2=19001; 44 string sResultC2; 45 //这里是网上找到一个比较厉害的itoa >> 后文附实现 46 sResultC2=itoa(iValueC2); 47 cout<<sResultC2<<endl; 48 49 //string -- int(C) 50 string sValueC="24680"; 51 int iResultC = atoi(sValueC.c_str()); 52 cout<<iResultC+1<<endl; 53 } 54 55 return 0; 56 }
如下是网上找到的一片比较经典的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 ' ' */ 6 static char buf[INT_DIGITS + 2]; 7 char *p = buf + INT_DIGITS + 1; /* points to terminating ' ' */ 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 }