it-swarm.com.ru

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

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 )

1782
Matthieu M.

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

// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    // fold expression
    ( 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<>); оба эти решения имеют лучшую производительность.

179
DevSolar

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

#include <sstream>

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

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

102
Rasoul

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

85
Jerry Coffin

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

#include <boost/lexical_cast.hpp>

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

Не будет ли проще использовать струнные потоки?

#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();
}
28
user2287915

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

string s = string(itoa(a));

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

19
Mehrdad

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

16
Throwback1986

Сначала включите:

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

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

std::to_string(42);

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

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

Или строка C:

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

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

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

Отказ от ответственности: я являюсь автором библиотеки формата C++.

10
vitaut

Использование потока строк для преобразования чисел опасно!

Смотрите http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ , где говорится, что operator<< вставляет форматированный вывод.

В зависимости от текущей локали целое число, превышающее 3 цифры, может быть преобразовано в строку из 4 цифр с добавлением дополнительного разделителя тысяч.

Например, int = 1000 может быть преобразован в строку 1.001. Это может привести к тому, что операции сравнения вообще не будут работать.

Поэтому я настоятельно рекомендую использовать способ std::to_string. Это проще и делает то, что вы ожидаете.

8
YesThatIsMyName

Для C++ 98 есть несколько вариантов:

boost/lexical_cast

Boost не является частью библиотеки C++, но содержит много полезных расширений библиотеки.

Шаблон функции lexical_cast предлагает удобную и согласованную форму для поддержки общих преобразований в и из произвольных типов, когда они представлены в виде текста. 
- Документация Boost

#include "boost/lexical_cast.hpp"
#include <string>

int main() {
    int x = 5;
    std::string x_str = boost::lexical_cast<std::string>(x);
    return 0;
}

Что касается времени выполнения, операция lexical_cast занимает около 80 микросекунд (на моем компьютере) при первом преобразовании, а затем значительно ускоряется, если выполняется избыточно.


itoa

Эта функция не определена в ANSI-C и не является частью C++, но поддерживается некоторыми компиляторами. 
- cplusplus.com

Это означает, что gccg++ не может скомпилировать код с использованием itoa.

#include <stdlib.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    x_str = itoa(x, x_str, 10); // base 10
    return 0;
}

Нет времени выполнения, чтобы сообщить. У меня не установлена ​​Visual Studio, которая по сообщениям может компилировать itoa.


sprintf

sprintf - это стандартная библиотечная функция C, которая работает со строками C и является вполне допустимой альтернативой.

Составляет строку с тем же текстом, который будет напечатан, если в printf использовался формат, но вместо печати содержимое сохраняется в виде строки C в буфере, указанном str. 
- cplusplus.com

#include <stdio.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    int chars_written = sprintf(x_str, "%d", x);
    return 0;
}

Заголовок stdio.h может не понадобиться. Что касается времени выполнения, операция sprintf занимает около 40 микросекунд (на моем компьютере) при первом преобразовании, а затем значительно ускоряется, если выполняется избыточно.


stringstream

Это основной способ преобразования целых чисел в строки библиотеки C++ и наоборот. Существуют сходные с stringstream аналогичные функции, которые дополнительно ограничивают предполагаемое использование потока, например ostringstream. Использование ostringstream определенно сообщает читателю вашего кода, что вы, по сути, собираетесь использовать только оператор <<. Эта функция - все, что особенно необходимо для преобразования целого числа в строку. Смотрите этот вопрос для более детального обсуждения.

#include <sstream>
#include <string>

int main() {
    int x = 5;
    std::ostringstream stream;
    stream << x;
    std::string x_str = stream.str();
    return 0;
}

Что касается времени выполнения, операция ostringstream занимает около 71 микросекунды (на моей машине), а затем значительно ускоряется, если выполняется избыточно, но _/не так сильно, как предыдущие функции.


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

8
Josh Detwiler

Довольно просто добавить синтаксический сахар, который позволяет составлять строки на лету, как поток

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

Теперь вы можете добавить все, что хотите (при условии, что для него определен оператор << (std::ostream& ..)), к strmake() и использовать его вместо std::string.

Пример:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}
3
AndreyS Scherbakov

Использование:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}
2
maverick9888

C++ 17 предоставляет std :: to_chars в качестве высокопроизводительной независимой от локали альтернативы.

2
user10133158

Я использую:

int myint = 0;
long double myLD = 0.0;

string myint_str = static_cast<ostringstream*>( &(ostringstream() << myint) )->str();
string myLD_str = static_cast<ostringstream*>( &(ostringstream() << myLD) )->str();

Он работает на моих компиляторах windows и linux g ++. 

1
J_C

У меня сработало вот этот код:

#include <iostream>
using namespace std;

int main()
{
    int n=32;
    string s=to_string(n);
    cout << "string: " + s  << endl;
    return 0;
}
1
Gonçalo Garrido
namespace std
{
    inline string to_string(int _Val)
    {   // convert long long to string
        char _Buf[2 * _MAX_INT_Dig];
        snprintf(_Buf, "%d", _Val);
        return (string(_Buf));
    }
}

теперь вы можете использовать to_string(5)

1
user1363411
#include "stdafx.h"
#include<iostream>
#include<string>
#include<string.h>


std::string intToString(int num);

int main()
{

    int integer = 4782151;

    std::string integerAsStr = intToString(integer);

    std::cout << "integer = " << integer << std::endl;
    std::cout << "integerAsStr = " << integerAsStr << std::endl;


    return 0;
}

std::string intToString(int num)
{
    std::string numAsStr;

    while (num)
    {
        char toInsert = (num % 10) + 48;
        numAsStr.insert(0, 1, toInsert);

        num /= 10;
    }

    return numAsStr;
}
1
Tayyab Mazhar

Вот еще один простой способ сделать 

char str[100] ; 
sprintf(str , "%d" , 101 ) ;  
string s = str; 

sprintf хорошо известен для вставки любых данных в строку требуемого формата.

Вы можете преобразовать массив char * в строку, как показано в третьей строке.

1
Natesh bhat
string number_to_string(int x){
    if(!x) return "0";
        string s,s2;
        while(x){
            s.Push_back(x%10 + '0');
            x/=10;
        }
    reverse(s.begin(),s.end());
    return s;
}
1
Abdullah Abdelmonem
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs,"%d",timeStart.elapsed()/1000);
sprintf(bufMs,"%d",timeStart.elapsed()%1000);
0
user2047065

Почему ты не можешь просто сделать

int a = 10;
string str = a + '0';
0
Ver Nick

Использование CString:

int a = 10;
CString strA;
strA.Format("%d", a);
0
Tur1ng

Я думаю, что использовать stringstream довольно просто.

 string toString(int n)
 {
   stringstream ss(n);
   ss << n;
   return ss.str();
 }

 int main()
 {
    int n;
    cin>>n;
    cout<<toString(n)<<endl;
    return 0;
 }
0
rashedcs

Используя "чистый" C++ (без C++ 11 и т.д.):

#include <bits/stdc++.h>

using namespace std;

string to_str(int x) {
    ostringstream ss;
    ss << x;
    return ss.str();
}

int main()
{
    int number = 10;
    string s = to_str(number);
    cout << s << endl;
    return 0;
}
0
Nelio Alves