Pertanyaan Cara termudah untuk mengonversi int ke string dalam C ++


Apa cara termudah untuk melakukan konversi int untuk setara string di C ++. Saya menyadari dua metode. Apakah ada cara yang lebih mudah?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

1208
2018-04-08 04:19


asal


Jawaban:


C ++ 11 memperkenalkan std::stoi (dan varian untuk setiap tipe numerik) dan std::to_string, rekan-rekan dari C atoi dan itoa tetapi dinyatakan dalam istilah std::string.

#include <string> 

std::string s = std::to_string(42);

Oleh karena itu adalah cara terpendek yang dapat saya pikirkan. Anda bahkan dapat menghilangkan penamaan jenis, menggunakan auto kata kunci:

auto s = std::to_string(42);

Catatan: lihat [string.konversi] (21,5 di n3242)


1592
2018-04-08 06:13



Mengambil diskusi dengan @ v.oddou beberapa tahun kemudian, C ++ 17 akhirnya memberikan cara untuk melakukan solusi tipe-agnostik yang berbasis makro (diawetkan di bawah) tanpa melalui kemalangan makro.

template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

Pemakaian:

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 ) );

Jawaban asli:

Karena "mengubah ... ke string" adalah masalah yang berulang, saya selalu mendefinisikan SSTR () makro di tajuk pusat sumber C ++ saya:

#include <sstream>

#define SSTR( x ) static_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()

Penggunaan semudah mungkin:

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 ) );

Di atas kompatibel dengan C ++ 98 (jika Anda tidak dapat menggunakan C ++ 11 std::to_string), dan tidak memerlukan pihak ketiga termasuk (jika Anda tidak dapat menggunakan Boost lexical_cast<>); kedua solusi lain ini memiliki kinerja yang lebih baik.


165
2018-04-08 04:23



Saya biasanya menggunakan metode berikut:

#include <sstream>

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

dijelaskan secara rinci sini.


96
2017-11-29 22:46



Mungkin cara mudah yang paling umum membungkus pada dasarnya pilihan kedua Anda ke dalam templat bernama lexical_cast, seperti yang ada di Dorongan, jadi kode Anda terlihat seperti ini:

int a = 10;
string s = lexical_cast<string>(a);

Satu hal yang baik dari ini adalah bahwa ia mendukung pemain lain juga (misalnya, dalam arah yang berlawanan juga berfungsi dengan baik).

Perhatikan juga bahwa meskipun lexical_cast Boost dimulai sebagai hanya menulis ke stringstream, kemudian mengekstraksi kembali keluar dari aliran, sekarang memiliki beberapa tambahan. Pertama-tama, spesialisasi untuk beberapa jenis telah ditambahkan, jadi untuk banyak jenis umum, itu jauh lebih cepat daripada menggunakan stringstream. Kedua, sekarang memeriksa hasilnya, jadi (misalnya) jika Anda mengonversi dari string menjadi int, itu bisa melempar pengecualian jika string berisi sesuatu yang tidak dapat dikonversi menjadi int (misalnya., 1234 akan berhasil, tapi 123abc akan melempar).

Pada C ++ 11, ada a std::to_string fungsi kelebihan beban untuk tipe integer, sehingga Anda dapat menggunakan kode seperti:

int a = 20;
std::string s = to_string(a);

Standar mendefinisikan ini sebagai setara dengan melakukan konversi dengan sprintf (menggunakan penentu konversi yang cocok dengan jenis objek yang disediakan, seperti %d untuk int), ke dalam buffer ukuran yang cukup, kemudian menciptakan std::string dari isi buffer itu.


84
2018-04-08 04:23



Jika Anda telah menginstal Boost (yang Anda harus):

#include <boost/lexical_cast.hpp>

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

40
2018-04-08 04:26



Bukankah lebih mudah menggunakan stringstream?

#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

Atau buat fungsi:

#include <sstream>

string IntToString (int a)
{
    ostringstream temp;
    temp<<a;
    return temp.str();
}

27
2018-04-16 19:37



Bukannya saya tahu, dalam C ++ murni. Tetapi sedikit modifikasi dari apa yang Anda sebutkan

string s = string(itoa(a));

harus bekerja, dan itu sangat singkat.


19
2018-04-08 04:22



sprintf() cukup bagus untuk konversi format. Anda kemudian dapat menetapkan string C yang dihasilkan ke string C ++ seperti yang Anda lakukan di 1.


16
2018-04-08 04:23



Pertama termasuk:

#include <string>
#include <sstream>

Kedua tambahkan metode:

template <typename T>
string NumberToString(T pNumber)
{
 ostringstream oOStrStream;
 oOStrStream << pNumber;
 return oOStrStream.str();
}

Gunakan metode seperti ini:

NumberToString(69);

atau

int x = 69;
string vStr = NumberToString(x) + " Hello word!."

12
2018-05-31 21:32