Перетворення int в std :: string


143

Який найкоротший шлях, бажано вбудований в рядок, перетворити int у рядок? Відповіді за допомогою stl та boost будуть вітатися.



63
В to_stringstd::string s = std::to_string(42)

5
Хай живе С ++ 11 та торінгрінг! :)
серпень

Відповіді:


351

Ви можете використовувати std :: to_string в C ++ 11

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

4
std :: to_string () не працює в MinGW, якщо когось цікавить.
Арчі

3
@bparker Правильно, це було зафіксовано у gcc 4.8.0, мабуть. MinGW, що постачається з останнім кодом :: Блоки (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());

36

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

Робота для всіх із підтримкою std :: ostream, але не така швидка, як, наприклад, itoa

Це навіть здається швидше, ніж stringstream або scanf:


15
Підвищення - твій друг, якщо не було простого способу зробити це в Standard C ++ ... Мені, звичайно, подобається те, що lexical_castприносить, але відчуваю, що Boost є значною мірою непосильним для подібних завдань ...
rubenvb

2
Перевищення? На основі чого? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/…
Catskul

Слід врахувати свою аудиторію, якщо вони не можуть використовувати Boost
Damian

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: Ти маєш рацію. Не призначений для компіляції, але змінений!
нейро

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 у string, використовуйте "%x"для перетворення int в hex-представлення тощо.


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перевантажень (зауважте, що це значення за замовчуванням до базової-10).


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

3
Мені це не подобається, коли нестандартні функції люблять itoa()або stricmp()даються як відповідь на що- небудь .
DevSolar

6
Вибачте, що образили вашу чутливість, але я заявив, що це було нестандартною функцією в першому реченні. Я не згадував про це, але sprintfтакож може досягти мети ОП (хоча все ще страждає від недостатньої гнучкості, якщо не потрібно нічого іншого, крім загальних базових чисел).
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 []в моєму другому прикладі - який буде каркати. Я знаю, що ОП запитувала лише про int, але цей більш загальний макрос настільки корисний (і насправді досить поширений), що я думав, що включу його сюди.
DevSolar

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

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/


необхідно включати наступне, щоб використовувати цей метод headhead файлів #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;

    }

не були подібні, але більш повні відповіді, вже дані багато років тому?
Вальтер

Так, але ця відповідь ідеальна, я думаю, оскільки я не отримав жодної ефективної відповіді від попередньої.
Шавон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.