C++中将整数转换为字符串的替代方法是什么?

159

我在想是否有一种替代方法来将整数转换为字符串,因为当我在Visual Studio中运行itoa()时会收到警告,并且当我尝试在Linux下构建我的程序时,会出现编译错误。


基本上是这个问题的相反。https://dev59.com/aHVC5IYBdhLWcg3wvTxa 答案是一样的。 - Martin York
16
以下是一些示例,可参考此链接:http://www.codeproject.com/KB/recipes/Tokenizer.aspx。它们非常高效且有些优雅。 - Matthieu N.
1
你可以在这里看到一个基准测试,比较了三种现代C++将整数转换为字符串的方法。 - Nikos Athanasiou
我在C语言中有同样的函数需求。我相信你可以想出如何在C++中进行封装。它是线程安全的,并处理所有正数、负数32位整数和零。性能非常优秀,算法精简,因此不会占用太多缓存。Ben Voigt有一种更快的方法,但它不是轻量级算法,所以除非你要做数十亿次这样的操作,否则可能过于复杂。 - user1899861
18个回答

4

分配足够长度的字符串,然后使用snprintf。


2
int number = 123;

stringstream = s;

s << number;

cout << ss.str() << endl;

2

我的看法是,这里提供的函数是最好的答案:

http://www.jb.man.ac.uk/~slowe/cpp/itoa.html

它模仿了许多库提供的非ANSI函数。

char* itoa(int value, char* result, int base);

它还具有闪电般的速度,并在 -O3 下进行了优化,而您没有使用c++ string_format() 或 sprintf 的原因是它们太慢了,对吗?


3
这是唯一完全回答问题的答案。C++ 的 to_string() 方法无法处理任意进制,因此不能复制 C 语言的 itoa 的全部功能。有点令人困惑为什么不会包括这个功能,特别是考虑到反函数 stoi() 可以处理任意进制。 - Daniel
2
更新的链接(同一篇文章):http://www.strudel.org.uk/itoa/ - nloveladyallen

2

我之前写了这个线程安全的函数,对结果感到非常满意。我觉得它的算法轻便高效,并且性能比标准 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 代码所证明的那样,我列出的代码完美地工作。

我相信这段代码足够精简,可以在嵌入式环境中使用。当然,你的情况可能有所不同。


2
如果您对快速且安全的整数转字符串方法感兴趣,而且不受标准库的限制,我可以推荐来自 {fmt} 库的 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())

根据 Boost Karma 的 整数转字符串转换基准测试,这种方法比 glibc 的 sprintfstd::stringstream 快数倍。甚至比 Boost Karma 自己的 int_generator 更快,这已经由一个独立的基准测试证实。
免责声明:我是这个库的作者。

1
请注意,所有的stringstream方法可能涉及到在格式化时使用区域对象进行锁定。如果您从多个线程使用此转换,则需要小心处理这一点...

更多信息请参见此处。在C++中将数字转换为指定长度的字符串


0

在基于Windows CE的平台上,默认情况下没有iostream。偏好的方法是使用_itoa<>系列函数,通常选择_itow<>(因为大部分字符串处理都是Unicode)。


-1

上述大部分建议在技术上并不是 C++,而是 C 的解决方案。

可以研究一下 std::stringstream 的使用。


1
@OJ:“从技术上讲,它们不是C ++” - 这是吹毛求疵(并且要进一步挑剔,正如onebyone所提到的,它们大多数从技术上讲都是C ++),特别是因为OP正在寻找itoa()的无警告替代品。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接