Вопрос: Самый простой способ конвертировать int в строку в C ++


Что является самым простым способом конвертировать из intк эквиваленту stringв C ++. Я знаю два метода. Есть ли более простой способ?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

1185


источник


Ответы:


C ++ 11 вводит std::stoi(и варианты для каждого числового типа) и std::to_string, аналоги C atoiа также itoaно выражается в std::string,

#include <string> 

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

поэтому самый короткий способ, о котором я могу думать. Вы можете даже опустить именование типа, используя autoключевое слово:

auto s = std::to_string(42);

Примечание: см. [string.conversions] ( +21,5 в n3242 )


1569



Подводя обсуждение с помощью @ v.oddou пару лет спустя, C ++ 17 наконец-то предоставил способ сделать изначально макро-основанное на тип-агностическое решение (сохранившееся ниже) без проходя через макро безобразию.

template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    ( 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 ) );

Оригинальный ответ:

Поскольку «преобразование ... в строку» является повторяющейся проблемой, я всегда определяю SSTR () макрос в центральном заголовке моих источников C ++:

#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<>); однако оба этих решения имеют лучшую производительность.


161



Обычно я использую следующий метод:

#include <sstream>

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

подробно описано Вот ,


96



Probably the most common easy way wraps essentially your second choice into a template named lexical_cast, such as the one in Boost, so your code looks like this:

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

One nicety of this is that it supports other casts as well (e.g., in the opposite direction works just as well).

Also note that although Boost lexical_cast started out as just writing to a stringstream, then extracting back out of the stream, it now has a couple of additions. First of all, specializations for quite a few types have been added, so for many common types, it's substantially faster than using a stringstream. Second, it now checks the result, so (for example) if you convert from a string to an int, it can throw an exception if the string contains something that couldn't be converted to an int (e.g., 1234 would succeed, but 123abc would throw).

As of C++11, there's a std::to_string function overloaded for integer types, so you can use code like:

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

The standard defines these as being equivalent to doing the conversion with sprintf (using the conversion specifier that matches the supplied type of object, such as %d for int), into a buffer of sufficient size, then creating an std::string of the contents of that buffer.


83



If you have Boost installed (which you should):

#include <boost/lexical_cast.hpp>

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

40



Wouldn't it be easier using 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

Or make a function:

#include <sstream>

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

27



Not that I know of, in pure C++. But a little modification of what you mentioned

string s = string(itoa(a));

should work, and it's pretty short.


19



sprintf() is pretty good for format conversion. You can then assign the resulting C string to the C++ string as you did in 1.


16