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

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


person Amir Rachum    schedule 12.01.2011    source источник
comment
comment
В C ++ 11 вы можете использовать to_string как std::string s = std::to_string(42)   -  person    schedule 24.04.2013
comment
Да здравствует C ++ 11 и to_string! :)   -  person augustin    schedule 19.02.2015


Ответы (10)


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

int i = 3;
std::string str = std::to_string(i);
person Yochai Timmer    schedule 10.11.2014
comment
std :: to_string () не работает в MinGW, если кому-то интересно. - person Archie; 09.11.2015
comment
@bparker Верно, я думаю, это было исправлено в gcc 4.8.0. MinGW, поставляемый с последней версией Code :: Blocks (13.12), по-прежнему имеет gcc 4.7.1. - person Archie; 02.12.2015

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

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

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

person ltjax    schedule 12.01.2011
comment
Boost - ваш друг, если бы в Standard C ++ не было простого способа сделать это ... Мне, конечно, нравится то, что приносит lexical_cast, но чувствую, что Boost в значительной степени избыточен для такого рода задач ... - person rubenvb; 12.01.2011
comment
Перебор? На чем основано? boost.org/doc/libs/1_53_0/doc/ html / boost_lexical_cast / - person Catskul; 04.06.2013
comment
Следует учитывать вашу аудиторию, если они не могут использовать Boost - person Damian; 27.02.2016
comment
Будут приветствоваться ответы с использованием stl и boost. - Аудитория считается - person Conrad Jones; 08.10.2017

Хорошо известный способ (до C ++ 11) сделать это - использовать оператор потока:

#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();
}
person neuro    schedule 12.01.2011
comment
Примечание: для этого требуется #include <sstream>. - person TechNyquist; 18.07.2016
comment
@TechNyquist: Вы правы. Не предназначено для компиляции, но изменено! - person neuro; 19.07.2016
comment
Значит, вы не хотели, чтобы он был компилируемым, но на самом деле с включением это есть :) - person TechNyquist; 19.07.2016
comment
@TechNyquist: Да, с некоторыми std::;) - person neuro; 20.07.2016

Если вы не можете использовать std::to_string из C ++ 11, вы можете написать его как это определено на cppreference.com:

std::string to_string( int value ) Преобразует десятичное целое число со знаком в строку с тем же содержанием, что и std::sprintf(buf, "%d", value) для достаточно большого буфера.

Выполнение

#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 в шестнадцатеричное представление и так далее.

person user2622016    schedule 28.09.2015

Нестандартная функция, но реализована на самых распространенных компиляторах:

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) .

person Zac Howland    schedule 12.01.2011
comment
@DevSolar: Вы должны уточнить. Пример наддува уже был приведен. Это решение доступно на большинстве компиляторов, когда boost не установлен (или ваши требования запрещают вам использовать его по какой-либо причине). ostream также работает, пока вам не понадобится сохранить числовую строку как нечто иное, чем двоичный, восьмеричный или шестнадцатеричный формат (например, base-32). - person Zac Howland; 12.01.2011
comment
Мне не нравится, когда нестандартные функции вроде itoa() или stricmp() даются в качестве ответа на что угодно. - person DevSolar; 12.01.2011
comment
Извините за оскорбление вашей чувствительности, но в первом предложении я указал, что это нестандартная функция. Я не упоминал об этом, но sprintf также может достичь цели OP (хотя все еще страдает отсутствием гибкости, если требуется что-то, кроме общих базовых чисел). - person Zac Howland; 12.01.2011
comment
Да, вы это заявили, и я не стал отрицать ваш ответ, даже когда мне это очень хотелось. Так что я думаю, что мы в расчете. ;-) - person DevSolar; 12.01.2011

Следующий макрос не такой компактный, как одноразовый 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;
}
person DevSolar    schedule 12.01.2011
comment
@rubenvb: Вы скажете мне, как превратить это в шаблон, и я обновлю все проекты C ++, в которых я использовал эту конструкцию. - person DevSolar; 12.01.2011
comment
@rubenvb: Извините, это было не так ясно, как должно было быть. Я не вижу способа превратить это в шаблон (используя C ++ 98), не теряя при этом возможности последовательного подключения выходов (как в моем втором примере) или придумывая запутанный беспорядок для обработки любое количество параметров и типов параметров. - person DevSolar; 12.01.2011
comment
@DevSolar: inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() } не подойдет? (Не тестировал, но мне интересно, что пойдет не так и почему? - person rubenvb; 12.01.2011
comment
@rubenvb: подойдет для человека int (мой первый пример). Но без ostream, видимого компилятору в main (так как он скрыт внутри функции шаблона), он попытается найти operator<<() для const char [] в моем втором примере - который будет квакать. Я знаю, что OP запрашивал только int, но этот более общий макрос настолько полезен (и на самом деле довольно широко распространен), что я подумал, что включу его здесь. - person DevSolar; 12.01.2011
comment
Для универсальности я предпочитаю функцию шаблона. Возможно, для гирляндной цепи это может быть обработано той же функцией с небольшим количеством RTTI ... - person neuro; 12.01.2011
comment
@neuro: Хорошо, напиши одну. Я, например, сам не люблю макросы, но этот довольно четко определен и хорошо себя ведет. И если альтернативой является какая-то пока еще недоступная шаблонная функция, которая каким-то образом справляется с задачей с большим количеством дополнительного кода и полагаясь на RTTI, я считаю, что тонкая грань между хорошей практикой (избегайте макросов, где это возможно) и фундаментализм (избегать макросов ЛЮБОЙ ЦЕНОЙ!) был пересечен. - person DevSolar; 12.01.2011
comment
@DevSolar: Да, daisychaining - это хорошо, но я бы написал это так: std::string s2( "i: " + SSTR(i) + ", x: " + SSTR(x) );, что, на мой взгляд, быстрее (меньше потоковых операторов) и более выразительно (вы не передаете все, включая const char*, в рассматриваемую функцию. Что Я люблю C ++ за эти педантичные дискуссии ;) - person rubenvb; 12.01.2011
comment
@rubenvb: Меньше потоковых операторов? Да, одним меньше. (У вас все еще есть std :: dec.) Четыре оператора потоковой передачи вместо моих пяти. За счет дополнительного временного ostringstream объекта, дополнительного str() вызова и трех operator+() вызовов, и чем длиннее становится шлейфовое соединение, тем хуже становится. ;-) Кроме того, я не понимаю, о чем вы говорите, передавая все в рассматриваемую функцию. Я не понимаю, где вы что-то экономите на этом ориентировочном уровне. - person DevSolar; 12.01.2011
comment
@DevSolar: Ну, ваш макрос передает все, что находится справа от последнего оператора потока внутри него (т.е. const char* также передаются в функцию / макрос, о котором идет речь). Что ж, я вполне могу ошибаться здесь, но все же я предоставил альтернативу встроенному шаблону функции ИМХО. - person rubenvb; 12.01.2011
comment
@rubenvb: Я думаю, что здесь происходит какое-то непонимание внутренней работы с вашей стороны. Это макрос, поэтому прохождения нет. И, как я уже сказал, мой макрос допускает шлейфовое соединение, именно так потоки должны работать в C ++. Ваш шаблон, с другой стороны, этого не делает и, следовательно, не является жизнеспособной заменой ИМХО. - person DevSolar; 12.01.2011
comment
@DevSolar: Хорошо, ты прав. Мои плохие навыки работы с шаблоном не могут закодировать Дополнительные возможности SSTR (i = ‹< x); И я полностью согласен с вашим утверждением о фундаментализме ^^ Вы получаете от меня +1. Привет вашему С64;) - person neuro; 17.01.2011
comment
@neuro: Хотел бы я еще иметь один. Впрочем, я неплохо лажу с VICE. Да, и у меня действительно все еще есть Amiga A600 в подвале. Вы хотите? ;-) - person DevSolar; 17.01.2011
comment
@DevSolar: Хорошо, спасибо, но у меня все еще есть старый A500, который, вероятно, больше не работает, но мой старый A1200 работал хорошо около 5 лет назад :) Я просто скучаю по своему старому Sinclair ZX81. Извините за свой C64;) - person neuro; 24.01.2011
comment
@DevSolar boost :: lexical_cast работает быстрее: boost.org / doc / libs / 1_53_0 / doc / html / boost_lexical_cast / - person Catskul; 04.06.2013
comment
@Catskul: Может быть. Но есть места, где Boost может не подходить. - person DevSolar; 04.06.2013

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

#include <sstream>

string IntToString (int a)
{
    stringstream temp;
    temp<<a;
    return temp.str();
}
person dodo    schedule 01.04.2019

Вы можете включить реализацию itoa в свой проект.
Вот itoa, измененный для работы с std :: string: http://www.strudel.org.uk/itoa/

person Community    schedule 30.01.2012

#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/

person Vipul Dungranee    schedule 05.01.2019
comment
должен включать следующее, чтобы использовать этот файл заголовка метода #include ‹string› #include ‹stdlib.h› - person Vipul Dungranee; 05.01.2019

Предположим, у меня есть 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;

    }
person Shawon    schedule 13.05.2016
comment
были не похожие, а более полные ответы, которые давались уже много лет назад? - person Walter; 14.05.2016
comment
Да, но я думаю, что этот ответ идеален, поскольку я не получил никакого эффективного ответа от предыдущего. - person Shawon; 14.05.2016