如何在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个回答

13

首先包含:

#include <string>
#include <sstream>

第二步,添加方法:
template <typename T>
string NumberToString(T pNumber)
{
 ostringstream oOStrStream;
 oOStrStream << pNumber;
 return oOStrStream.str();
}

使用方法如下:

NumberToString(69);

或者

int x = 69;
string vStr = NumberToString(x) + " Hello word!."

11

在 C++11 中,我们可以使用 "to_string()" 函数将整数转换为字符串:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int x = 1612;
    string s = to_string(x);
    cout << s<< endl;

    return 0;
}

9

C++17提供了std::to_chars作为更高性能的与地区设置无关的选择。


1
对于性能密集型应用程序,您需要使用这个而不是stringstream路线。 - gast128

6
如果你需要将一个指定位数的整数快速转换为左前导'0'的char*,以下是针对小端架构(所有x86、x86_64及其他)的示例:
如果你要转换一个两位数:
int32_t s = 0x3030 | (n/10) | (n%10) << 8;

如果您要转换三位数:

int32_t s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;

如果您要转换一个四位数:

int64_t s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;

这样一直持续到七位数。在这个例子中,n是一个给定的整数。转换后,可以通过(char*)&s访问其字符串表示:

std::cout << (char*)&s << std::endl;
注意: 如果你需要按 big-endian 字节顺序排列,我没有测试过,但这里有个例子:对于三位数,它应该是 int32_t s = 0x00303030 | (n/100)<< 24 | (n/10%10)<<16 | (n%10)<<8; 对于四位数(64位架构):int64_t s = 0x0000000030303030 | (n/1000)<<56 | (n/100%10)<<48 | (n/10%10)<<40 | (n%10)<<32; 我认为它应该可以使用。

5
C++随着时间的推移不断发展,其中包括将int转换为字符串的方法。 我将在这个答案中提供一个总结。 请注意,有些方法不直接给你一个std::string,而是一个char*。你可以很容易地将char*转换为前者,在某些情况下,避免使用std::string是有益的。
比较
下表比较了所有选项(只包括C++标准选项,没有第三方库),从最新到最旧。
方法 结果 优点和缺点
std::format
std::string ✔️ 通用方法(适用于可格式化类型)
✔️ 支持常见的进制和区域设置
❌ 编译速度慢
❌ 速度慢(转发到std::vformat
std::to_chars
写入到
char[]
✔️ 快速且零开销(无动态分配)
✔️ 支持任意基数作为运行时参数
❌ 仅适用于基本类型
❌ 接口不符合人体工程学原则
std::to_string
std::string ✔️ 简洁明了
✔️ 零开销(如果需要std::string
❌ 仅适用于基本类型
❌ 仅支持十进制
std::ostringstream
std::string ✔️ 通用方法(适用于具有<<运算符的类型)
✔️ 考虑区域设置(例如,可以更改进制)
❌ 速度慢,流的开销较高
std::sprintf
写入到
char[]
✔️ 最小的汇编输出
✔️ 支持一些进制
✔️ 与C兼容,与其他所有方法不同
❌ 仅适用于基本类型
❌ 接口不符合人体工程学原则
❌ 无类型安全性

推荐做法

如果你只需要将一个整数转换为十进制字符串,可以使用std::to_string。它简单、优雅且正确。

如果无法使用std::to_string,根据你所需的功能选择另一种选项。更倾向于使用像std::to_chars这样的现代解决方案,而不是像std::sprintf这样的旧解决方案。

示例

std::format
std::string d = std::format("{}", 100);   // d = "100"
std::string h = std::format("{:#x}", 15); // h = "0xf"
std::to_chars
std::array<char, 5> a;
auto [ptr, ec] = std::to_chars(a.data(), a.data() + a.size(), 1234);
// a = {'1', '2', '3', '4', indeterminate} (no null terminator!)
// ptr points to 4, and ec == std::errc{}
// notice that there is no null terminator
std::string_view view(a.data(), ptr); // string_view doesn't require null terminators
std::string s(a.data(), ptr); // wrapping in a std:string kinda defeats the point
std::to_string
std::string d = std::to_string(100); // d = "100"

std::ostringstream
std::string d = (std::ostringstream() << 100).str();            // d = "100"
std::string h = (std::ostringstream() << std::hex << 15).str(); // h = "0xf"
sprintf / snprintf
char a[20];
sprintf(a, "%d", 15);                // a = {'1', '5', '\0', ?, ?, ?, ...}
snprintf(a, sizeof(a), "%#x", 15);   // a = {'0', 'x', 'f', '\0', ?, ?, ...}
std::string s = a;

3

添加一些语法糖非常容易,使得可以在流式方式中即时组合字符串。

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

现在,您可以追加任何您想要的内容(前提是为其定义了运算符 << (std::ostream& ..)),并将其用于 strmake() 的位置,以代替 std::string

例如:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}

2
int i = 255;
std::string s = std::to_string(i);

在C++中,to_string()函数将整数值表示为一系列字符,并创建一个字符串对象。

2
虽然这段代码可能解决了OP的问题,但最好还是解释一下你的代码如何解决OP的问题。这样,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。SO不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能被点赞。这些特点以及所有帖子都必须是自包含的要求,是SO作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释。 - ysf

1

使用:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}

3
仅适用于字面数字,不评估变量内容,尽管有时很有用。 - Wolf
正确。但在某些时候肯定很方便。 - maverick9888
1
仅适用于编译时使用字面常量数字,我认为OP要求使用变量整数进行动态转换。 - Ing. Gerardo Sánchez

0

C++11引入了std::to_string(),用于数字类型:

int n = 123; // Input, signed/unsigned short/int/long/long long/float/double
std::string str = std::to_string(n); // Output, std::string

4
你好!你能否解释一下为什么以及如何提供答案给这个问题? - anothernode

0

使用:

#include<iostream>
#include<string>

std::string intToString(int num);

int main()
{
    int integer = 4782151;

    std::string integerAsStr = intToString(integer);

    std::cout << "integer = " << integer << std::endl;
    std::cout << "integerAsStr = " << integerAsStr << std::endl;

    return 0;
}

std::string intToString(int num)
{
    std::string numAsStr;
    bool isNegative = num < 0;
    if(isNegative) num*=-1;

    do
    {
       char toInsert = (num % 10) + 48;
       numAsStr.insert(0, 1, toInsert);

       num /= 10;
    }while (num);
  
    return isNegative? numAsStr.insert(0, 1, '-') : numAsStr;
}

4
n≤0时完全失败。 - Toby Speight

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