将int转换为std :: string

Ami*_*hum 131 c++ string int

将int转换为字符串的最短路径是什么,最好是内联的?使用stl和boost的答案将受到欢迎.

Yoc*_*mer 331

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

int i = 3;
std::string str = std::to_string(i);
Run Code Online (Sandbox Code Playgroud)

  • 如果有人关心,std :: to_string()在MinGW中不起作用. (3认同)
  • @bparker对,它已经在gcc 4.8.0中得到修复我想.MinGW带有最新的Code :: Blocks(13.12)仍然有gcc 4.7.1. (3认同)
  • @Archie它适用于mingw gcc 4.9.2 (2认同)

Ben*_*oit 47

#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());
Run Code Online (Sandbox Code Playgroud)


ltj*_*jax 36

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

使用std :: ostream支持一切工作,但速度不快,例如, itoa

它甚至看起来比stringstream或scanf更快:

  • Boost是你的朋友,如果没有一种简单的方法在标准C++中这样做......我当然喜欢`lexical_cast`带来的东西,但感觉Boost对于这类任务来说太过分了...... (15认同)
  • "欢迎使用stl和boost的答案." - 观众考虑 (5认同)
  • 矫枉过正?基于什么?http://www.boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/performance.html (2认同)

neu*_*uro 30

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

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用模板函数^^将其概括为任何类型

#include <sstream>

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

  • 注意:这需要`#include &lt;sstream&gt;`。 (2认同)

Zac*_*and 14

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

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

更新

C++ 11引入了几个std::to_string重载(注意它默认为base-10).

  • 很抱歉冒犯了你的感情,但我确实说它是第一句中的非标准功能.我没有提到它,但是'sprintf`也可以实现OP的目标(尽管如果需要除了常见基数以外的其他任何东西,仍然会缺乏灵活性). (6认同)
  • @DevSolar:你应该详细说明.已经给出了提升示例.如果未安装boost(或者您的要求禁止您因任何原因使用它),大多数编译器都可以使用此解决方案.`ostream`也可以工作,直到你需要将数字字符串保存为二进制,八进制或十六进制格式之外的其他东西(例如base-32). (3认同)
  • 当像'itoa()`或`stricmp()`这样的非标准函数作为*anything*的答案时,我不喜欢它. (3认同)

use*_*016 14

如果您无法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;
}
Run Code Online (Sandbox Code Playgroud)

你可以用它做更多的事情.只是用于"%g"将float或double转换为字符串,用于"%x"将int转换为十六进制表示,依此类推.


Dev*_*lar 8

下面的宏并不像一个一次性使用的紧凑型ostringstreamboost::lexical_cast.

但是如果你需要在代码中重复转换为字符串,那么这个宏在使用上比直接处理字符串流或每次显式转换都更优雅.

它也非常通用,因为它可以转换所有支持的东西operator<<(),甚至可以组合使用.

定义:

#include <sstream>

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
            ( std::ostringstream() << std::dec << x ) ).str()
Run Code Online (Sandbox Code Playgroud)

说明:

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;
}
Run Code Online (Sandbox Code Playgroud)