Boost - ваш друг, если бы в Standard C ++ не было простого способа сделать это ... Мне, конечно, нравится то lexical_cast, что приносит, но чувствую, что Boost в значительной степени избыточен для такого рода задач ...
Примечание: для этого требуется #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::stringto_string( int x ){
int length = snprintf( NULL, 0, "%d", x );
assert( length >= 0 );
char* buf = newchar[length + 1];
snprintf( buf, length + 1, "%d", x );
std::stringstr( buf );
delete[] buf;
return str;
}
Вы можете сделать с ним больше. Просто используйте "%g"для преобразования float или double в строку, используйте "%x"для преобразования int в шестнадцатеричное представление и так далее.
@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>intmain(){
int i = 42;
std::string s1 = SSTR( i );
int x = 23;
std::string s2 = SSTR( "i: " << i << ", x: " << x );
return0;
}
@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>:
to_string
какstd::string s = std::to_string(42)
Ответы:
Вы можете использовать std :: to_string в С ++ 11
int i = 3; std::string str = std::to_string(i);
источник
#include <sstream> #include <string> const int i = 3; std::ostringstream s; s << i; const std::string i_as_string(s.str());
источник
boost::lexical_cast<std::string>(yourint)
изboost/lexical_cast.hpp
Работает для всего с поддержкой std :: ostream, но не так быстро, как, например,
itoa
Он даже кажется быстрее, чем stringstream или scanf:
источник
lexical_cast
, что приносит, но чувствую, что Boost в значительной степени избыточен для такого рода задач ...Хорошо известный способ сделать это - использовать оператор потока:
#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(); }
источник
#include <sstream>
.std::
;)Если вы не можете использовать
std::to_string
из C ++ 11, вы можете написать его, как это определено на cppreference.com:Реализация
#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 в шестнадцатеричное представление и так далее.источник
Нестандартная функция, но реализована на большинстве распространенных компиляторов:
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).источник
ostream
работает, пока вам не понадобится сохранить числовую строку как нечто иное, чем двоичный, восьмеричный или шестнадцатеричный формат (например, base-32).itoa()
илиstricmp()
даются как ответ на что угодно .sprintf
также может достичь цели OP (хотя все еще страдает отсутствием гибкости, если требуется что-то, кроме общих базовых чисел).Следующий макрос не такой компактный, как одноразовый
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; }
источник
inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }
? (Не тестировал, но мне интересно, что может пойти не так и почему?int
(мой первый пример). Но безostream
видимого компилятораmain
(как он спрятан внутри функции шаблона), он будет пытаться искатьoperator<<()
дляconst char []
в моем втором примере - который будет каркать. Я знаю, что OP запрашивал только одинint
, но этот более общий макрос настолько полезен (и на самом деле довольно широко распространен), что я подумал, что включу его здесь.Вы можете использовать эту функцию для преобразования
int
вstd::string
после включения<sstream>
:#include <sstream> string IntToString (int a) { stringstream temp; temp<<a; return temp.str(); }
источник
Вы можете включить реализацию itoa в свой проект.
Здесь itoa изменен для работы с std :: string: http://www.strudel.org.uk/itoa/
источник
#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/
источник
Предположим, у меня есть
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; }
источник