Самый простой способ конвертировать int в строку в С++
Самый простой способ конвертировать из 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();
Ответы
Ответ 1
С++ 11 вводит std::stoi
(и варианты для каждого числового типа) и std::to_string
, аналоги C atoi
и itoa
но выражается в std::to_string
std::string
.
#include <string>
std::string s = std::to_string(42);
поэтому самый короткий способ, о котором я могу думать. Вы даже можете опустить именование типа, используя ключевое слово auto
:
auto s = std::to_string(42);
Примечание: см. [String.conversions] (21.5 в n3242)
Ответ 2
Продолжая обсуждение с @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
) и не требует никаких сторонних lexical_cast<>
(если вы не можете использовать Boost lexical_cast<>
); оба эти решения имеют лучшую производительность.
Ответ 3
Я обычно использую следующий метод:
#include <sstream>
template <typename T>
std::string NumberToString ( T Number )
{
std::ostringstream ss;
ss << Number;
return ss.str();
}
Это подробно описано здесь.
Ответ 4
Вероятно, наиболее распространенный простой способ, по сути, включает ваш второй выбор в шаблон с именем lexical_cast
, например, в Boost, поэтому ваш код выглядит следующим образом:
int a = 10;
string s = lexical_cast<string>(a);
Одна из них заключается в том, что она поддерживает другие отливки (например, в противоположном направлении работает так же хорошо).
Также обратите внимание, что хотя Boost lexical_cast начинался как просто запись в строковый поток, а затем извлечение обратно из потока, теперь у него есть несколько дополнений. Прежде всего, были добавлены специализации для довольно многих типов, поэтому для многих распространенных типов они существенно быстрее, чем использование строкового потока. Во-вторых, теперь он проверяет результат, поэтому (например), если вы преобразовываете из строки в int
, он может генерировать исключение, если строка содержит то, что не может быть преобразовано в int
(например, 1234
будет успешным, но 123abc
будет бросать).
Как и в С++ 11, существует функция std::to_string
, перегруженная для целых типов, поэтому вы можете использовать код, например:
int a = 20;
std::string s = to_string(a);
Стандарт определяет их как эквивалент выполнения преобразования с помощью sprintf
(используя спецификатор преобразования, который соответствует предоставленному типу объекта, например %d
для int
), в буфер достаточного размера, тогда создавая std::string
содержимого этого буфера.
Ответ 5
Если у вас установлен Boost (что вам нужно):
#include <boost/lexical_cast.hpp>
int num = 4;
std::string str = boost::lexical_cast<std::string>(num);
Ответ 6
Было бы проще использовать stringstreams:
#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();
}
Ответ 7
Не то, что я знаю, в чистом С++. Но небольшая модификация того, что вы упомянули
string s = string(itoa(a));
должен работать, и он довольно короткий.
Ответ 8
sprintf()
довольно хорош для преобразования формата. Затем вы можете назначить полученную строку C строке С++, как вы это делали в 1.
Ответ 9
Вы можете использовать std::to_string
доступный в C++ 11, как предложено Матье М.:
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}.
Ответ 10
Сначала включите:
#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!."
Ответ 11
Использование stringstream для преобразования чисел опасно!
См. Http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/, где говорится, что operator<<
вставляет форматированный вывод.
В зависимости от текущей локали целое число, превышающее 3 цифры, может быть преобразовано в строку из 4 цифр с добавлением дополнительного разделителя тысяч.
Например, int = 1000
может быть преобразовано в строку 1.001
. Это может привести к тому, что операции сравнения вообще не будут работать.
Поэтому я настоятельно рекомендую использовать путь std::to_string
. Это проще и делает то, что вы ожидаете.
Обновлено (см. Комментарии ниже):
С++ 17 предоставляет std :: to_chars как высокопроизводительную независимую от локали альтернативу
Ответ 12
Для C++ 98 существует несколько вариантов:
boost/lexical_cast
Boost не является частью библиотеки C++, но содержит множество полезных расширений библиотеки.
lexical_cast
функции lexical_cast
предлагает удобную и согласованную форму для поддержки общих преобразований и от произвольных типов, когда они представлены в виде текста.
- Дополнительная документация
#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
Это означает, что gcc
/g++
не может скомпилировать код с помощью 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 микросекунды (на моей машине), а затем значительно ускоряется после этого, если выполняется избыточно, но не так сильно, как предыдущие функции.
Конечно, есть и другие варианты, и вы можете даже перенести одну из них в свою собственную функцию, но это дает аналитический взгляд на некоторые из популярных.
Ответ 13
Использование:
#define convertToString(x) #x
int main()
{
convertToString(42); // Returns const char* equivalent of 42
}
Ответ 14
Довольно легко добавить синтаксический сахар, который позволяет составлять строки "на лету" потоковым способом
#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;
}
Ответ 15
С++ 17 предоставляет std :: to_chars в качестве высокопроизводительной независимой от локали альтернативы.
Ответ 16
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;
}
Ответ 17
Вот еще один простой способ сделать
char str[100];
sprintf(str, "%d", 101);
string s = str;
sprintf
- это общеизвестный способ вставки любых данных в строку требуемого формата.
Вы можете преобразовать массив char *
в строку, как показано в третьей строке.
Ответ 18
Использование:
#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;
}
Ответ 19
Это сработало для меня -
Мой код:
#include <iostream>
using namespace std;
int main()
{
int n = 32;
string s = to_string(n);
cout << "string: " + s << endl;
return 0;
}
Ответ 20
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)
.
Ответ 21
Я использую:
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++.
Ответ 22
С++ 11 ввел std::to_string()
для числовых типов:
int n = 123; // Input, signed/unsigned short/int/long/long long/float/double
std::string str = std::to_string(n); // Output, std::string
Ответ 23
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs, "%d", timeStart.elapsed()/1000);
sprintf(bufMs, "%d", timeStart.elapsed()%1000);
Ответ 24
Если вы используете MFC, вы можете использовать CString
:
int a = 10;
CString strA;
strA.Format("%d", a);
Ответ 25
Вы используете тип счетчика алгоритма для преобразования в строку. Я получил эту технику от программирования компьютеров Commodore 64. Это также хорошо для программирования игр.
-
Вы берете целое число и берете каждую цифру, которая взвешена на степени 10. Поэтому предположим, что целое число равно 950.
-
Если целое число равно или больше 100 000, то вычтите 100 000 и увеличьте счетчик в строке на ["000000"];
продолжайте делать это до тех пор, пока в позиции 100 000 больше не останется цифр. Отбросьте еще одну степень десяти.
-
Если целое число равно или больше 10000, то вычтите 10000 и увеличьте счетчик в строке на ["000000"] + 1 позиция;
продолжайте делать это до тех пор, пока не останется цифр в позиции 10000.
-
Отбросьте еще одну степень десяти
- Повторите шаблон
Я знаю, что 950 слишком мал для использования в качестве примера, но я надеюсь, что вы поняли идею.
Ответ 26
Если вам требуется быстрое преобразование целого числа с фиксированным числом цифр в char * слева от "0", это удобный пример:
int n = 27;
char s[8];
Если вы преобразуете двузначное число:
*(int32_t*)s = 0x3030 | (n/10) | (n%10) << 8;
Если вы преобразуете трехзначное число:
*(int32_t*)s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;
Если вы преобразуете четырехзначное число:
*(int64_t*)s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;
И так далее до семизначных чисел:)
Ответ 27
Вы можете просто сделать:
int a = 10;
string str = a + '0';
Ответ 28
#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;
}
Ответ 29
Я думаю, что использовать 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;
}