Каков самый короткий способ, желательно встроенный, преобразовать int в строку? Ответы с использованием stl и boost будут приветствоваться.
to_string
какstd::string s = std::to_string(42)
Каков самый короткий способ, желательно встроенный, преобразовать int в строку? Ответы с использованием stl и boost будут приветствоваться.
to_string
какstd::string s = std::to_string(42)
Ответы:
Вы можете использовать std :: to_string в С ++ 11
int i = 3;
std::string str = std::to_string(i);
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:
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 в строку, используйте "%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
, но этот более общий макрос настолько полезен (и на самом деле довольно широко распространен), что я подумал, что включу его здесь.
Вы можете включить реализацию 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;
}