在 C ++ 中将 int 转换为字符串的最简单方法

在 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();

答案

C ++ 11 引入了std::stoi (以及每种数字类型的变体)和std::to_string ,它们是 C atoiitoa的对应物,但用std::string

#include <string> 

std::string s = std::to_string(42);

因此,这是我能想到的最短的方法。您甚至可以使用auto关键字省略命名类型:

auto s = std::to_string(42);

注意:请参阅[string.conversions]n3242 中为 21.5

几年后,通过与 @ v.oddou 进行讨论,C ++ 17 终于提供了一种无需经历宏的丑陋就可以完成最初基于宏的类型不可知的解决方案的方法(下面保留)。

// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    // fold expression
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

用法:

int i = 42;
std::string s = sstr( "i is: ", i );
puts( sstr( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( sstr( "Foo is '", x, "', i is ", i ) );

原始答案:

由于 “将... 转换为字符串” 是一个经常出现的问题,因此我总是在 C ++ 源代码的中央标头中定义SSTR()宏:

#include <sstream>

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

用法尽可能简单:

int i = 42;
std::string s = SSTR( "i is: " << i );
puts( SSTR( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) );

上面是 C ++ 98 兼容的(如果您不能使用 C ++ 11 std::to_string ),并且不需要任何第三方包含(如果您不能使用 Boost lexical_cast<> );这些其他解决方案都具有更好的性能。

我通常使用以下方法:

#include <sstream>

template <typename T>
  std::string NumberToString ( T Number )
  {
     std::ostringstream ss;
     ss << Number;
     return ss.str();
  }

进行详细说明。

最常见的简单方法大概就是将您的第二选择包装到名为lexical_cast ,例如Boost 中的模板,因此您的代码如下所示:

int a = 10;
string s = lexical_cast<string>(a);

这样的好处之一是它也支持其他类型的转换(例如,相反方向的效果也一样)。

还要注意,尽管 Boost lexical_cast 刚开始只是写到一个字符串流,然后从该流中提取回来,但它现在有几个附加项。首先,已经添加了许多类型的专门化,因此对于许多常见类型,它比使用 stringstream 的速度快得多。其次,它现在检查结果,因此(例如)如果您从字符串转换为int ,并且如果该字符串包含无法转换为int (例如1234将成功,但是123abc会抛出)。

从 C ++ 11 开始,有一个std::to_string函数为整数类型重载,因此您可以使用类似以下的代码:

int a = 20;
std::string s = to_string(a);

该标准将它们定义为等效于使用sprintf进行转换(使用与提供的对象类型匹配的转换说明符,例如%d表示int )到足够大小的缓冲区中,然后创建一个std::string该缓冲区的内容。

如果您安装了 Boost(应该这样做):

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);

使用 stringstreams 会更容易:

#include <sstream>

int x = 42;          // The integer
string str;          // The string
ostringstream temp;  // 'temp' as in temporary
temp << x;
str = temp.str();    // str is 'temp' as string

或做一个功能:

#include <sstream>

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

我不知道,在纯 C ++ 中。但是对您提到的内容做了一些修改

string s = string(itoa(a));

应该可以,而且很短。

sprintf()非常适合格式转换。然后可以像在 1 中所做的那样将结果 C 字符串分配给 C ++ 字符串。

您可以使用Matthieu M. 建议的 C ++ 11 中可用的std::to_string

std::to_string(42);

或者,如果性能至关重要(例如,如果进行了大量转换),则可以使用{fmt}库中的fmt::format_int将整数转换为std::string

fmt::format_int(42).str();

或 C 字串:

fmt::format_int f(42);
f.c_str();

后者不做任何动态内存分配,并且比 Boost Karma 基准测试中的std::to_string快 10 倍以上。有关更多详细信息,请参见C ++ 中的快速整数到字符串的转换

请注意,两者都是线程安全的。

std::to_string不同, fmt::format_int不需要 C ++ 11,并且可以与任何 C ++ 编译器一起使用。

免责声明:我是 {fmt} 库的作者。

首先包括:

#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!."