Преобразование int в std :: string


154

Каков самый короткий способ, желательно встроенный, преобразовать int в строку? Ответы с использованием stl и boost будут приветствоваться.



64
В C ++ 11 вы можете использовать to_stringкакstd::string s = std::to_string(42)

5
Да здравствует C ++ 11 и to_string! :)
август

Ответы:


367

Вы можете использовать std :: to_string в С ++ 11

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

4
std :: to_string () не работает в MinGW, если кому-то интересно.
Арчи

3
@bparker Верно, я думаю, это было исправлено в gcc 4.8.0. MinGW, поставляемый с последней версией Code :: Blocks (13.12), по-прежнему имеет gcc 4.7.1.
Арчи

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

37

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

Работает для всего с поддержкой std :: ostream, но не так быстро, как, например, itoa

Он даже кажется быстрее, чем stringstream или scanf:


15
Boost - ваш друг, если бы в Standard C ++ не было простого способа сделать это ... Мне, конечно, нравится то lexical_cast, что приносит, но чувствую, что Boost в значительной степени избыточен для такого рода задач ...
rubenvb

2
Перебор? На чем основано? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/…
Catskul 03

Следует подумать о вашей аудитории, если они не могут использовать Boost
Дамиан

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

@TechNyquist: Вы правы. Не предназначено для компиляции, но изменено!
Neuro

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перегрузок (обратите внимание, что по умолчанию используется base-10).


3
@DevSolar: Вы должны уточнить. Пример наддува уже был приведен. Это решение доступно в большинстве компиляторов, когда boost не установлен (или ваши требования запрещают вам использовать его по какой-либо причине). Это также ostreamработает, пока вам не понадобится сохранить числовую строку как нечто иное, чем двоичный, восьмеричный или шестнадцатеричный формат (например, base-32).
Zac Howland,

3
Не люблю, когда нестандартные функции вроде itoa()или stricmp()даются как ответ на что угодно .
DevSolar

6
Извините за оскорбление вашей чувствительности, но в первом предложении я указал, что это нестандартная функция. Я не упоминал об этом, но sprintfтакже может достичь цели OP (хотя все еще страдает отсутствием гибкости, если требуется что-то, кроме общих базовых чисел).
Zac Howland,

1
Да, вы заявили об этом, и я не стал отрицать ваш ответ, даже когда мне это очень хотелось. Так что я думаю, что мы в расчете. ;-)
DevSolar

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

@DevSolar: не подойдет inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }? (Не тестировал, но мне интересно, что может пойти не так и почему?
rubenvb

@rubenvb: подойдет для человека int(мой первый пример). Но без ostreamвидимого компилятора main(как он спрятан внутри функции шаблона), он будет пытаться искать operator<<()для const char []в моем втором примере - который будет каркать. Я знаю, что OP запрашивал только один int, но этот более общий макрос настолько полезен (и на самом деле довольно широко распространен), что я подумал, что включу его здесь.
DevSolar

Для универсальности я предпочитаю функцию шаблона. Возможно, для гирляндной цепи с этим можно справиться в той же функции с небольшим количеством RTTI ...
Neuro

2

Вы можете использовать эту функцию для преобразования intв std::stringпосле включения <sstream>:

#include <sstream>

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


-2
#include <string>
#include <stdlib.h>

Вот еще один простой способ преобразовать int в строку

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

вы можете посетить эту ссылку для получения дополнительных методов https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/


должен включать следующее, чтобы использовать этот файл заголовка метода #include <string> #include <stdlib.h>
Vipul Dungranee

-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;

    }

были не похожие, а более полные ответы, которые давались уже много лет назад?
Уолтер

Да, но я думаю, что этот ответ идеален, поскольку я не получил никакого эффективного ответа от предыдущего.
Shawon
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.