如何在C++中将整数转换为字符串?

2110
如何在C++中将int转换为等效的string?我知道两种方法。还有其他方法吗?
(1)
int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

6
我认为你给出的两种方法都是不错的解决方案。这取决于需要使用方法的上下文。例如,如果您已经在使用流(stream),比如读写文件,则第二种方法是最好的选择。如果您需要将整数转换为字符串以传递给函数参数,则 itoa 可能是一种简单的方式。但是大多数情况下,整数到字符串的转换发生在处理文件时,所以流是合适的。 - Charles Brunet
63
选项1对你来说怎么可能有效?据我了解,itoa()需要三个参数。 - arkon
3
itoa 方法比流等效方法更快。此外,使用 itoa 方法可以重复使用字符串缓冲区(如果您经常生成字符串,则避免堆分配。例如,对于某些快速更新的数值输出)。或者,您可以生成自定义 streambuf 以减少一些分配开销等。首先构建流也不是低成本的事情。 - Pete
7
@Pete: 一旦你开始担心哪一个更快,你可以看一下这个网址:https://dev59.com/TG855IYBdhLWcg3wbjrO - Ben Voigt
25
请注意,itoa()不是标准的一部分,因此使用它会使您的代码不可移植,因为并非所有编译器都支持它。对于Linux而言,除非您使用的不是GCC,否则您肯定不行,因为GCC不支持此函数。如果您有C++0x,请按@Matthieu在他的答案中建议的去做。如果不是这种情况,请使用stringstream,因为它是一个得到广泛支持的特性,您的代码应该与每个C++编译器兼容。作为替代方案,您总是可以使用sprintf()。 - rbaleksandar
显示剩余2条评论
32个回答

0

使用普通的标准stdio头文件,您可以将整数通过sprintf转换为缓冲区,如下所示:

#include <stdio.h>

int main()
{
    int x = 23;
    char y[2]; // The output buffer
    sprintf(y, "%d", x);
    printf("%s", y)
}

记得根据你的需求(字符串输出大小)来注意你的缓冲区大小


虽然我喜欢你的回答,但是它是不正确的:你忘记了空字符来标记转换后字符串的结尾(即,在这种情况下,输出字符串的大小必须至少为3)。请参见https://www.gnu.org/software/libc/manual/html_node/Formatted-Output-Functions.html。 - SRG

0

使用我的函数"inToString"

它接受一个名为"number"的整数参数

记住,你可以将参数类型更改为FLOAT或DOUBLE而不是INT,例如:

"inToString(float number)" 或 "inToString(double number)"

这样也可以正常工作,但请确保给它相同的类型 ^_^

#include<iostream>
#include<sstream>

using namespace std;


string inToString(int number){

     stringstream stream;

     stream << number;
    
     string outString;
    
     stream >> outString;

     return  outString;

 }

 int main(){

     int number = 100;

     string stringOut = inToString(number);

     cout << "stringOut : " + stringOut << endl;

     return 0;

 }

0
我使用:

int myint = 0;
long double myLD = 0.0;

string myint_str = static_cast<ostringstream*>(&(ostringstream() << myint))->str();
string myLD_str = static_cast<ostringstream*>(&(ostringstream() << myLD))->str();

它在我的Windows和Linux g++编译器上运行良好。


0

9
请注意,这是一个只适用于微软的扩展:http://msdn.microsoft.com/en-us/library/ms174288.aspx。 - JonnyJD
1
我喜欢CString::Format()的想法。不幸的是,它只能在微软平台上使用,无法移植。 - Nick

-1

这里有另一种简单的方法:

char str[100];
sprintf(str, "%d", 101);
string s = str;

sprintf 是一个众所周知的函数,可以将任何数据插入到所需格式的字符串中。

您可以像第三行所示那样将 char * 数组转换为字符串。


-2
string number_to_string(int x) {

    if (!x)
        return "0";

    string s, s2;
    while(x) {
        s.push_back(x%10 + '0');
        x /= 10;
    }
    reverse(s.begin(), s.end());
    return s;
}

2
谢谢您提供这个代码片段,它可能会为一些短期帮助提供有限的帮助。一个适当的解释将极大地提高其长期价值,因为它可以展示为什么这是一个好的解决方案,并使其对未来有类似问题的读者更有用。请编辑您的答案以添加一些说明,包括您所做出的假设。 - Toby Speight
1
对于 n≤0,完全失败。 - Toby Speight
2
添加注释,解释你的答案,阅读如何回答 - Aksen P

-2

你所需要做的就是在定义变量时使用String(例如:String intStr)。每当你需要使用该变量时,调用whateverFunction(intStr.toInt())


你能提供关于 toInt() 的参考资料吗? "String"(大写的 "S")是在哪里定义的?是某个供应商特定的库的一部分吗?你确定它是 C++ 吗?它在 Arduino 环境 中,但这可能不算数。它似乎不是 标准字符串类 的一部分。 - Peter Mortensen
你在什么上测试它了?编译器,包括版本。运行环境(操作系统,IDE等)?C++版本? - Peter Mortensen

-3

这对我有用 -

我的代码:

#include <iostream>
using namespace std;

int main()
{
    int n = 32;
    string s = to_string(n);
    cout << "string: " + s  << endl;
    return 0;
}

@PeterMortensen 仔细看,这是 std::to_string() - Kotauskas
我有 using namespace std; :) - Gonçalo Garrido

-3

您可以使用计数器类型的算法将其转换为字符串。我从编程Commodore 64计算机中学到了这种技术。它也非常适用于游戏编程。

  • 您需要取整数并获取每个数字,这些数字按10的幂加权。因此,假设整数为950。

    • 如果整数等于或大于100,000,则减去100,000并在字符串中的["000000"]位置上增加计数器;
      继续执行,直到100,000位置没有更多数字。 再降一位十进制数。

    • 如果整数等于或大于10,000,则减去10,000并在字符串中的["000000"] + 1位置上增加计数器;
      继续执行,直到10,000位置没有更多数字。

  • 再降一位十进制数

  • 重复该模式

我知道950太小了,无法作为示例,但我希望您能理解这个概念。


1
用代码示例展示算法比仅仅描述它更有帮助。 - cdeerinck

-3
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs, "%d", timeStart.elapsed()/1000);
sprintf(bufMs, "%d", timeStart.elapsed()%1000);

13
内存泄漏,-1来自我。 - paulm
1
这似乎是缓冲区溢出的味道。 - Kotauskas

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