Який найкоротший шлях, бажано вбудований в рядок, перетворити 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 в C ++ 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 у string, використовуйте "%x"
для перетворення int в hex-представлення тощо.
Нестандартна функція, але реалізована на більшості поширених компіляторів:
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).
ostream
працює, поки вам не потрібно зберегти числовий рядок як щось інше, ніж бінарний, восьмеричний або шістнадцятковий формат (наприклад, base-32).
itoa()
або stricmp()
даються як відповідь на що- небудь .
sprintf
також може досягти мети ОП (хоча все ще страждає від недостатньої гнучкості, якщо не потрібно нічого іншого, крім загальних базових чисел).
Наступний макрос не настільки компактний, як одноразове використання 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 []
в моєму другому прикладі - який буде каркати. Я знаю, що ОП запитувала лише про int
, але цей більш загальний макрос настільки корисний (і насправді досить поширений), що я думав, що включу його сюди.
Ви можете включити реалізацію 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;
}