Alternative to itoa() for converting integer to string C++?
我想知道是否有其他方法可以替代
在C++ 11中,可以使用EDCOX1×0:
1 2 3 | #include <string> std::string s = std::to_string(5); |
如果你在C++ 11之前工作,你可以使用C++流:
1 2 3 4 5 6 7 | #include <sstream> int i = 5; std::string s; std::stringstream out; out << i; s = out.str(); |
摘自http://notfaq.wordpress.com/2006/08/30/c-convert-int-to-string/
Boost::词汇演员表工作得很好。
1 2 3 4 | #include <boost/lexical_cast.hpp> int main(int argc, char** argv) { std::string foo = boost::lexical_cast<std::string>(argc); } |
考古学
ITOA是一个非标准的辅助函数,旨在补充ATOI标准函数,可能隐藏了一个sprintf(它的大部分功能可以用sprintf实现):http://www.cplusplus.com/reference/clibrary/cstdlib/itoa.html
C方式使用S喷雾剂。或者SNPrTNF。或者你找到的任何工具。
尽管一些功能不在标准中,正如他的一个评论中的"One ByOne"所正确提到的,大多数编译器都会提供一个替代方案(例如Visual C++有它自己的SNSNPRTF,如果需要的话,您可以将TyPulf发送到SNPRTNF)。
C++方式。在STD:STRIGSTATH(或者甚至是弃用STD::STRESFH)中使用C++流(如Habor萨特在他的一本书中提出的那样,因为它稍微快一点)。
结论你在C++中,这意味着你可以选择你想要的方式:
更快的方法(即C方法),但是您应该确保代码是应用程序中的瓶颈(过早的优化是邪恶的,等等),并且您的代码是安全封装的,以避免缓冲区溢出的风险。
更安全的方式(即C++方式),如果你知道代码的这一部分并不重要,那么最好确保代码的这一部分不会在随机的时刻中断,因为有人误解了一个大小或指针(这是发生在现实生活中的,比如…昨天,在我的电脑上,因为有人认为使用更快的方法而不需要它是"酷"的。
尝试Simulf():
1 2 3 | char str[12]; int num = 3; sprintf(str,"%d", num); // str now contains"3" |
sprintf()与printf()类似,但输出到字符串。
另外,正如注释中提到的,您可能希望使用snprintf()来阻止发生缓冲区溢出(您要转换的数字不适合您的字符串大小)。它的工作方式如下:
1 | snprintf(str, sizeof(str),"%d", num); |
在幕后,词汇演员会这样做:
1 2 3 4 | std::stringstream str; str << myint; std::string result; str >> result; |
如果你不想为此"拖入"助推器,那么使用上面的方法是一个很好的解决方案。
我们可以在C++中定义我们自己的EDOCX1 7函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 | string itoa(int a) { string ss=""; //create empty string while(a) { int x=a%10; a/=10; char i='0'; i=i+x; ss=i+ss; //append new character at the front of the string! } return ss; } |
别忘了给
C++11最终解决了这个问题,提供了
我使用这些模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | template <typename T> string toStr(T tmp) { ostringstream out; out << tmp; return out.str(); } template <typename T> T strTo(string tmp) { T output; istringstream in(tmp); in >> output; return output; } |
尝试Booost .Frase/FASTFLASE,两个高质量C++库:
1 2 | int i = 10; std::string result; |
带增强格式
1 | result = str(boost::format("%1%", i)); |
或FastFormat
1 2 | fastformat::fmt(result,"{0}", i); fastformat::write(result, i); |
显然,它们都比简单地转换一个整数做得多。
实际上,您可以使用一个巧妙编写的模板函数将任何内容转换为字符串。此代码示例使用循环在win-32系统中创建子目录。字符串连接运算符operator+,用于将根与后缀连接起来以生成目录名。后缀是通过使用模板函数将循环控制变量i转换为C++字符串而创建的,并用另一个字符串将其连接起来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | //Mark Renslow, Globe University, Minnesota School of Business, Utah Career College //C++ instructor and Network Dean of Information Technology #include <cstdlib> #include <iostream> #include <string> #include <sstream> // string stream #include <direct.h> using namespace std; string intToString(int x) { /**************************************/ /* This function is similar to itoa() */ /*"integer to alpha", a non-standard */ /* C language function. It takes an */ /* integer as input and as output, */ /* returns a C++ string. */ /* itoa() returned a C-string (null- */ /* terminated) */ /* This function is not needed because*/ /* the following template function */ /* does it all */ /**************************************/ string r; stringstream s; s << x; r = s.str(); return r; } template <class T> string toString( T argument) { /**************************************/ /* This template shows the power of */ /* C++ templates. This function will */ /* convert anything to a string! */ /* Precondition: */ /* operator<< is defined for type T */ /**************************************/ string r; stringstream s; s << argument; r = s.str(); return r; } int main( ) { string s; cout <<"What directory would you like me to make?"; cin >> s; try { mkdir(s.c_str()); } catch (exception& e) { cerr << e.what( ) << endl; } chdir(s.c_str()); //Using a loop and string concatenation to make several sub-directories for(int i = 0; i < 10; i++) { s ="Dir_"; s = s + toString(i); mkdir(s.c_str()); } system("PAUSE"); return EXIT_SUCCESS; } |
分配足够长度的字符串,然后使用snprintf。
最好的答案是IMO,这里提供的功能是:
网址:http://www.jb.man.ac.uk/~slowe/cpp/itoa.html
它模仿许多libs提供的非ansi函数。
1 | char* itoa(int value, char* result, int base); |
它也是闪电快的,并且在-O3之下被优化,以及你不使用C++ StRIGIG格式(…)的原因…或者说sprintf是他们太慢了,对吧?
注意,所有
更多信息请参见此处。用C++将数字转换为具有指定长度的字符串
1 2 3 4 5 6 7 | int number = 123; stringstream = s; s << number; cout << ss.str() << endl; |
如果您对快速和安全的整数到字符串转换方法感兴趣,并且不限于标准库,我可以从C++格式库中推荐EDCOX1×0的方法:
1 2 3 | fmt::FormatInt(42).str(); // convert to std::string fmt::FormatInt(42).c_str(); // convert and get as a C string // (mind the lifetime, same as std::string::c_str()) |
根据Boost Karma的整数到字符串转换基准,该方法比glibc的
免责声明:我是这个图书馆的作者。
我在一段时间前编写了这个线程安全函数,对结果非常满意,并且认为该算法是轻量级和精简的,性能大约是标准msvc Itoa()函数的3倍。
这是链接。优化的Base-10 Only ITOA()函数?性能至少是sprintf()的10倍。基准也是功能的QA测试,如下所示。
1 2 3 4 5 6 7 8 9 10 11 | start = clock(); for (int i = LONG_MIN; i < LONG_MAX; i++) { if (i != atoi(_i32toa(buff, (int32_t)i))) { printf(" Error for %i", i); } if (!i) printf(" At zero"); } printf(" Elapsed time was %f milliseconds", (double)clock() - (double)(start)); |
对于使用调用者的存储,有一些愚蠢的建议,这些建议会使结果浮动在调用者地址空间的缓冲区中。忽略它们。正如基准/QA代码所示,我列出的代码工作得很好。
我相信这段代码足够精简,可以在嵌入式环境中使用。当然了。
在Windows CE派生的平台上,默认情况下没有
以上建议大部分技术上不是C++,而是C解决方案。
研究STD:STRIGSWATH的使用。