我在想是否有一种替代方法来将整数转换为字符串,因为当我在Visual Studio中运行itoa()
时会收到警告,并且当我尝试在Linux下构建我的程序时,会出现编译错误。
我在想是否有一种替代方法来将整数转换为字符串,因为当我在Visual Studio中运行itoa()
时会收到警告,并且当我尝试在Linux下构建我的程序时,会出现编译错误。
分配足够长度的字符串,然后使用snprintf。
int number = 123;
stringstream = s;
s << number;
cout << ss.str() << endl;
我的看法是,这里提供的函数是最好的答案:
http://www.jb.man.ac.uk/~slowe/cpp/itoa.html
它模仿了许多库提供的非ANSI函数。
char* itoa(int value, char* result, int base);
它还具有闪电般的速度,并在 -O3 下进行了优化,而您没有使用c++ string_format() 或 sprintf 的原因是它们太慢了,对吗?
to_string()
方法无法处理任意进制,因此不能复制 C 语言的 itoa
的全部功能。有点令人困惑为什么不会包括这个功能,特别是考虑到反函数 stoi()
可以处理任意进制。 - Daniel我之前写了这个线程安全的函数,对结果感到非常满意。我觉得它的算法轻便高效,并且性能比标准 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 代码所证明的那样,我列出的代码完美地工作。
我相信这段代码足够精简,可以在嵌入式环境中使用。当然,你的情况可能有所不同。
format_int
方法:fmt::format_int(42).str(); // convert to std::string
fmt::format_int(42).c_str(); // convert and get as a C string
// (mind the lifetime, same as std::string::c_str())
sprintf
或 std::stringstream
快数倍。甚至比 Boost Karma 自己的 int_generator
更快,这已经由一个独立的基准测试证实。stringstream
方法可能涉及到在格式化时使用区域对象进行锁定。如果您从多个线程使用此转换,则需要小心处理这一点...
更多信息请参见此处。在C++中将数字转换为指定长度的字符串
在基于Windows CE的平台上,默认情况下没有iostream
。偏好的方法是使用_itoa<>
系列函数,通常选择_itow<>
(因为大部分字符串处理都是Unicode)。
上述大部分建议在技术上并不是 C++,而是 C 的解决方案。
可以研究一下 std::stringstream 的使用。