将int转换为std::string

224

如何最短地(最好是内联方式)将整数转换为字符串?欢迎使用STL和Boost库的答案。


77
在C++11中,您可以使用to_string,例如:std::string s = std::to_string(42) - user283145
6
长久的C++11和to_string! :) - augustin
1
可能是Easiest way to convert int to string in C++的重复问题。 - UmNyobe
12个回答

468

你可以在C++11中使用std::to_string


int i = 3;
std::string str = std::to_string(i);

7
如果有人在意的话,MinGW中无法使用std::to_string()。 - Archie
5
@bparker 对的,我想gcc 4.8.0已经修复了这个问题。最新的Code::Blocks(13.12)附带的MinGW仍然使用gcc 4.7.1版本。 - Archie

50
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());

这也很好包括针对C++11之前的技术。这段代码也可以写成:std::ostringstream().operator<<(i).str()吗? - kevinarpe

39

嗯,在 C++11 之前,广为人知的方法是使用流操作符:

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

当然,你可以使用模板函数将其泛化为任何类型^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

2
注意:这需要使用 #include <sstream> - Niki Romagnoli
@TechNyquist:你说得对。它不是为了可编译性而设计的,但已经改变了! - neuro
1
所以你本来不是想让它可编译,但实际上通过包含它就可以了 :) - Niki Romagnoli
1
@TechNyquist:是的,使用一些 std:: ;) - neuro

37

16
如果在标准C++中没有简单的方法来完成这个任务,那么Boost是你的朋友。当然我喜欢lexical_cast所带来的便利,但是感觉Boost在这种任务上显得过于笨重了。 - rubenvb
2
过度设计?基于什么?http://www.boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/performance.html - Catskul
1
如果您的受众无法使用Boost,请考虑他们。 - Damian
6
欢迎使用STL和Boost进行回答。 - Conrad Jones

20

如果您无法使用C++11中的std::to_string,您可以按照cppreference.com上定义的方式编写:

  

std::string to_string( int value )   将带符号的十进制整数转换为与std::sprintf(buf, "%d", value)在足够大的buf上产生相同内容的字符串。

实现

#include <cstdio>
#include <string>
#include <cassert>

std::string to_string( int x ) {
  int length = snprintf( NULL, 0, "%d", x );
  assert( length >= 0 );
  char* buf = new char[length + 1];
  snprintf( buf, length + 1, "%d", x );
  std::string str( buf );
  delete[] buf;
  return str;
}
你可以更多地使用它。只需使用“%g”将浮点数或双精度转换为字符串,使用“%x”将整数转换为十六进制表示等等。

15

这是一个非标准函数,但大多数常见的编译器都已经实现了它:

int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);

更新

C++11引入了几个std::to_string重载(注意它默认为十进制)。


3
@DevSolar:您需要详细说明。已经给出了boost示例。当未安装boost(或您的要求禁止您使用它)时,大多数编译器都可用此解决方案。ostream 也可以使用,但当您需要将数字字符串保存为其他格式(如基于32位的格式)时,就不再适用于二进制、八进制或十六进制格式。 - Zac Howland
3
我不喜欢非标准函数(例如itoa()stricmp())被用作回答任何问题的解决方法。 - DevSolar
6
很抱歉冒犯了您的感受,但我在第一句话中确实说过这是一个非标准函数。虽然我没有提到,但sprintf也可以完成OP的目标(尽管如果需要除常见基数数字以外的任何内容仍然缺乏灵活性)。 - Zac Howland
1
是的,你说过了,我甚至在想要这么做时也没有给你的回答点踩。所以我认为我们现在扯平了。;-) - DevSolar

8
以下宏定义不如单次使用的ostringstreamboost::lexical_cast那样紧凑。
但如果您需要在代码中反复进行字符串转换,与直接处理字符串流或每次进行显式转换相比,此宏更加优雅易用。
它也非常通用,因为它可以转换由operator<<()支持的所有内容,甚至是组合形式。
定义:
#include <sstream>

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
            ( std::ostringstream() << std::dec << x ) ).str()

解释:

std::dec是一种无副作用的方式,将匿名的ostringstream转换为通用的ostream,以便operator<<()函数查找正确地适用于所有类型。(如果第一个参数是指针类型,则会出现问题。)

dynamic_cast将类型返回到ostringstream,因此您可以在其上调用str()

用法:

#include <string>

int main()
{
    int i = 42;
    std::string s1 = SSTR( i );

    int x = 23;
    std::string s2 = SSTR( "i: " << i << ", x: " << x );
    return 0;
}

1
@rubenvb:你告诉我如何将这个转换为模板,我就会更新我一直在使用这个结构的所有C++项目。 - DevSolar
对于多功能性,我更喜欢模板函数。对于daisy-chain,也许可以在同一个函数中使用一些RTTI来处理... - neuro
@rubenvb:我认为你这边对内部工作原理有些误解。这是一个宏,所以没有“传递”的概念。正如我所说,我的宏允许串联,这也是C++中流应该工作的方式。然而,你的模板却不行,因此在我看来不能替代。 - DevSolar
@DevSolar boost::lexical_cast 更快:http://www.boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/performance.html - Catskul
@Catskul:可能是这样。但是有些地方可能无法使用Boost。 - DevSolar
显示剩余10条评论

3

在包含<sstream>之后,您可以使用此函数将int转换为std::string

#include <sstream>

string IntToString (int a)
{
    stringstream temp;
    temp<<a;
    return temp.str();
}

2
虽然`std::to_string`是一个简单直接的工具,但从C++20开始,你可以使用``来进行更加复杂的从`int`到`string`的转换。
#include <iostream>
#include <locale>
#include <format>

int main()
{
    using std::cout, std::endl;

    auto const n = 42;
    cout << std::format("{}", n) << endl;
    cout << std::format("{:d}", n) << endl;
    cout << std::format("{:#x}", n) << endl;
    cout << std::format("{:#o}", n) << endl;
    cout << std::format("{:#b}", n) << endl;
}

输出:

42
42
0x2a
052
0b101010

0

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