将int转换为std :: string


Answers:


350

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

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

4
如果有人关心,std :: to_string()在MinGW中不起作用。
Archie 2015年

3
@bparker是的,我猜它已在gcc 4.8.0中修复。MinGW附带最新的Code :: Blocks(13.12)仍具有gcc 4.7.1。
Archie

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

36

boost::lexical_cast<std::string>(yourint)boost/lexical_cast.hpp

借助std :: ostream支持,所有工作都可以完成,但是速度不如例如 itoa

它甚至似乎比stringstream或scanf更快:


15
Boost是您的朋友,如果在Standard C ++中没有简单的方法可以做到这一点……我当然喜欢它lexical_cast带来的好处,但是觉得Boost对于这种任务几乎是多余的……
rubenvb 2011年


如果他们无法使用Boost,则应考虑您的听众
Damian 2016年

5
“欢迎使用stl和boost的答案。” -考虑了受众群体
康拉德·琼斯

30

众所周知的方法是使用流运算符:

#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();
}

1
注意:这是必需的#include <sstream>
TechNyquist '16

@TechNyquist:你是​​对的。并不是要编译,而是要更改!
神经

1
所以您并不是说它可以编译,但实际上包含它是:)
TechNyquist

1
@TechNyquist:是的,有一些std::;)
神经

16

如果无法std::to_string从C ++ 11使用,则可以按照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"将float或double转换为字符串,用于"%x"将int转换为十六进制表示,依此类推。


14

非标准函数,但在大多数常见编译器上实现:

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重载(请注意,默认情况下它以10为底)。


3
@DevSolar:您应该详细说明。已经给出了增强示例。当未安装boost时(或者您的要求禁止您出于任何原因使用它),该解决方案可用于大多数编译器。在ostream您需要将数字字符串另存为二进制,八进制或十六进制格式(例如,base-32)之前,该方法同样有效。
Zac Howland

3
当非标准函数喜欢itoa()stricmp()给出任何答案时,我不喜欢它。
DevSolar 2011年

6
抱歉冒犯了您的敏感性,但我确实在第一句话中指出这是一种非标准功能。我没有提到它,但是sprintf也可以实现OP的目标(尽管如果需要除通用基数以外的任何其他东西,仍然会缺乏灵活性)。
Zac Howland

1
是的,您确实说过,即使您觉得我很乐意,我也没有拒绝您的回答。所以我认为我们甚至是。;-)
DevSolar 2011年

8

以下宏并不像一次性宏ostringstream或那样紧凑boost::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

@rubenvb:对不起,这还没有达到应有的程度。我没有找到一种方法来将其转换为模板(使用C ++ 98)而又不会失去以菊花链方式输出的能力(如第二个示例),也不必想出复杂的混乱来处理的方法任何数量的参数和参数类型。
DevSolar 2011年

@DevSolar:不会inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }吗?(未经测试,但我确实想知道会出什么问题,为什么呢?
rubenvb 2011年

@rubenvb:它将对个人有用int(我的第一个例子)。但是,如果没有ostream可见的编译器main(因为它是在模板函数中隐藏),它会尝试查找operator<<()const char []我的第二个例子-这将呱呱叫。我知道OP仅要求提供int,但是这个更通用的宏是如此有用(实际上相当普遍),以至于我想将其包括在这里。
DevSolar 2011年

对于多功能性,我更喜欢模板功能。对于菊花链,也许可以用一点RTTI在相同的功能中处理...
Neuro11

2

您可以使用此功能转换intstd::string包括后<sstream>

#include <sstream>

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



-3

假设我有integer = 0123456789101112。现在,该整数可以由stringstream类转换为字符串。

这是C ++中的代码:

   #include <bits/stdc++.h>
   using namespace std;
   int main()
   {
      int n,i;
      string s;
      stringstream st;
      for(i=0;i<=12;i++)
      {
        st<<i;
      }
      s=st.str();
      cout<<s<<endl;
      return 0;

    }

是不是很相似,但是很多年前已经给出了更完整的答案?
沃尔特

是的,但是我认为这个答案是完美的,因为我没有从之前得到任何有效的答案。
沙原
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.