Самый простой способ конвертировать int в строку в C ++ - PullRequest
1415 голосов
/ 08 апреля 2011

Какой самый простой способ конвертировать из 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();

Ответы [ 27 ]

1875 голосов
/ 08 апреля 2011

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 in n3242 )

179 голосов
/ 08 апреля 2011

Пару лет спустя, начав дискуссию с @ v.oddou, C ++ 17 наконец-то предоставил способ сделать изначально основанное на макросах решение, не зависящее от типа (сохранено ниже) без сквозь уродство макроса"это повторяющаяся проблема, я всегда определяю макрос 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<>);оба эти решения имеют лучшую производительность.

102 голосов
/ 30 ноября 2012

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

#include <sstream>

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

Подробно описано здесь .

85 голосов
/ 08 апреля 2011

Вероятно, наиболее распространенный простой способ - это, по сути, ваш второй выбор в шаблон с именем 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 содержимого этого буфера.

41 голосов
/ 08 апреля 2011

Если у вас установлен Boost (что вам и нужно):

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);
27 голосов
/ 16 апреля 2013

Было бы проще использовать строковые потоки:

#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();
}
19 голосов
/ 08 апреля 2011

Не то, что я знаю, в чистом C ++. Но маленькая модификация того, что вы упомянули

string s = string(itoa(a));

должно работать, и оно довольно короткое.

16 голосов
/ 08 апреля 2011

sprintf() очень хорошо подходит для преобразования формата.Затем вы можете присвоить полученную строку C строке C ++, как вы это делали в 1.

13 голосов
/ 25 мая 2014

Вы можете использовать std::to_string, доступный в C ++ 11, как , предложенный Matthieu M. :

std::to_string(42);

Или, если производительность критична (например, если вы делаетемного преобразований), вы можете использовать fmt::format_int из библиотеки {fmt} для преобразования целого числа в std::string:

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

или строку C:

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

Последний не выполняет динамического выделения памяти и более чем в 10 раз быстрее, чем std::to_string в тестах Boost Karma.См. Быстрое преобразование целых чисел в строку в C ++ для получения дополнительной информации.

Обратите внимание, что оба они поточно-ориентированы.

В отличие от std::to_string, fmt::format_int не требует C ++ 11 и работает с любым компилятором C ++.

Отказ от ответственности: я являюсь автором библиотеки {fmt}.

11 голосов
/ 01 июня 2013

Первое включает:

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