我想知道是否有itoa()
的替代方法将整数转换为字符串,因为当我在visual Studio中运行它时会收到警告,当我尝试在Linux下构建我的程序时,我得到了一个编译错误。
答案 0 :(得分:171)
在C ++ 11中,您可以使用std::to_string
:
#include <string>
std::string s = std::to_string(5);
如果您在使用C ++ 11之前,可以使用C ++流:
#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/
答案 1 :(得分:54)
boost::lexical_cast效果非常好。
#include <boost/lexical_cast.hpp>
int main(int argc, char** argv) {
std::string foo = boost::lexical_cast<std::string>(argc);
}
答案 2 :(得分:47)
itoa是一个非标准的辅助函数,旨在补充atoi标准函数,并且可能隐藏了sprintf(其大部分功能可以用sprintf实现):http://www.cplusplus.com/reference/clibrary/cstdlib/itoa.html
使用sprintf。或snprintf。或者你找到的任何工具。
尽管有些函数不在标准中,正如他的一篇评论中“onebyone”正确提到的那样,大多数编译器都会为你提供一个替代方案(例如,Visual C ++有自己的_snprintf,如果需要,你可以输入sndef到snprintf它)。
使用C ++流(在当前案例中使用std :: stringstream(甚至是已弃用的std :: strstream,正如Herb Sutter在他的一本书中提出的那样,因为它有点快)。
你使用的是C ++,这意味着你可以选择你想要的方式:
更快的方式(即C方式),但你应该确保代码是你的应用程序的瓶颈(过早的优化是邪恶的,等等),并且你的代码是安全封装的,以避免存在缓冲区溢出的风险
更安全的方式(即C ++方式),如果你知道代码的这一部分并不重要,那么最好确保代码的这部分不会随意中断,因为有人误认了一个大小或指针(在现实生活中发生,如...昨天,在我的计算机上,因为有人认为使用更快的方式“酷”而不需要它)。
答案 3 :(得分:34)
尝试sprintf():
char str[12];
int num = 3;
sprintf(str, "%d", num); // str now contains "3"
sprintf()与printf()类似,但输出为字符串。
另外,正如Parappa在评论中提到的那样,您可能希望使用snprintf()来阻止缓冲区溢出(您转换的数字不符合字符串的大小。)它的工作原理如下:
snprintf(str, sizeof(str), "%d", num);
答案 4 :(得分:20)
在幕后,lexical_cast会这样做:
std::stringstream str;
str << myint;
std::string result;
str >> result;
如果您不想为此“拖入”提升,那么使用上述方法是一个很好的解决方案。
答案 5 :(得分:10)
我们可以在c ++中将我们自己的iota
函数定义为:
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;
}
不要忘记#include <string>
。
答案 6 :(得分:9)
С++ 11最终解决了这个提供std::to_string
的问题。
此外,boost::lexical_cast
是旧版编译器的便捷工具。
答案 7 :(得分:8)
我使用这些模板
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;
}
答案 8 :(得分:6)
尝试Boost.Format或FastFormat这两个高质量的C ++库:
int i = 10;
std::string result;
与Boost.Format
result = str(boost::format("%1%", i));
或FastFormat
fastformat::fmt(result, "{0}", i);
fastformat::write(result, i);
显然,它们都比单个整数的简单转换做得更多
答案 9 :(得分:6)
您可以使用一个巧妙编写的模板函数将任何内容转换为字符串。此代码示例使用循环在Win-32系统中创建子目录。字符串连接运算符operator +用于将根与后缀连接以生成目录名。通过使用模板函数将循环控制变量i转换为C ++字符串并将其与另一个字符串连接来创建后缀。
//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;
}
答案 10 :(得分:3)
分配足够长度的字符串,然后使用snprintf。
答案 11 :(得分:2)
最好的答案,IMO,是这里提供的功能:
http://www.jb.man.ac.uk/~slowe/cpp/itoa.html
它模仿许多lib提供的非ANSI函数。
char* itoa(int value, char* result, int base);
它也很闪电并在-O3下很好地优化,你不使用c ++ string_format()...或sprintf的原因是它们太慢了,对吧?
答案 12 :(得分:1)
int number = 123;
stringstream = s;
s << number;
cout << ss.str() << endl;
答案 13 :(得分:1)
请注意,所有stringstream
方法可能涉及锁定使用区域设置对象进行格式化。如果您从多个线程使用此转换,则可能需要警惕...
请点击此处了解更多信息。 Convert a number to a string with specified length in C++
答案 14 :(得分:1)
如果您对快速以及安全的整数到字符串转换方法感兴趣而不仅限于标准库,我可以推荐C++ Format库中的FormatInt
方法:
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的integer to string conversion benchmarks,此方法比glibc的sprintf
或std::stringstream
快几倍。它比Boost Karma自己的int_generator
更快,正如independent benchmark确认的那样。
免责声明:我是这个图书馆的作者。
答案 15 :(得分:1)
我前段时间写过这个线程安全函数,对结果感到非常满意,觉得算法轻巧而精简,性能约为标准MSVC _itoa()函数的3倍。
这是链接。 Optimal Base-10 only itoa() function?性能至少是sprintf()的10倍。基准测试也是函数的QA测试,如下所示。
start = clock();
for (int i = LONG_MIN; i < LONG_MAX; i++) {
if (i != atoi(_i32toa(buff, (int32_t)i))) {
printf("\nError for %i", i);
}
if (!i) printf("\nAt zero");
}
printf("\nElapsed time was %f milliseconds", (double)clock() - (double)(start));
有一些关于使用调用者存储的愚蠢建议会使结果浮动在调用者地址空间的缓冲区中。别理他们。我列出的代码完美无缺,正如基准/ QA代码所示。
我相信这段代码足够精简,可以在嵌入式环境中使用。当然是YMMV。
答案 16 :(得分:0)
在Windows CE派生的平台上,默认情况下没有iostream
。前往那里的方式是_itoa<>
系列,通常是_itow<>
(因为大多数字符串的东西都是Unicode)。
答案 17 :(得分:-1)
上述大多数建议在技术上都不是C ++,它们是C解决方案。
查看std::stringstream的使用情况。