Apa cara termudah untuk mengkonversi dari int
menjadi setara string
di C ++. Saya mengetahui 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();
c++
string
int
type-conversion
Nemo
sumber
sumber
itoa()
mengambil tiga parameter.Jawaban:
C ++ 11 memperkenalkan
std::stoi
(dan varian untuk setiap jenis numerik) danstd::to_string
, rekan-rekan dari Catoi
danitoa
tetapi dinyatakan dalam istilahstd::string
.Oleh karena itu cara terpendek yang dapat saya pikirkan. Anda bahkan dapat menghilangkan penamaan tipe, menggunakan
auto
kata kunci:Catatan: lihat [string.conversions] ( 21.5 di n3242 )
sumber
to_string
bukan anggotastd
perbaikan: stackoverflow.com/questions/12975341/…g++ -std=c++11 someFile.cc
std
di setiap kompiler yang saya tahu kecuali satu.Error : No instance of overloaded function "std::to_string" matches the argument list
saya menggunakan VS2010 c ++string s = to_string((_ULonglong)i);
Mengambil diskusi dengan @ v.oddou beberapa tahun kemudian, C ++ 17 akhirnya memberikan cara untuk melakukan solusi agnostik tipe makro yang awalnya (disimpan di bawah) tanpa melalui keburukan makro.
Pemakaian:
Jawaban asli:
Karena "konversi ... ke string" adalah masalah berulang, saya selalu mendefinisikan makro SSTR () di header pusat sumber C ++ saya:
Penggunaannya semudah:
Di atas adalah kompatibel C ++ 98 (jika Anda tidak dapat menggunakan C ++ 11
std::to_string
), dan tidak memerlukan pihak ketiga termasuk (jika Anda tidak dapat menggunakan Boostlexical_cast<>
); kedua solusi lain ini memiliki kinerja yang lebih baik.sumber
dynamic_cast
tetapi saya menggunakan dentang untuk mengkompilasi sehingga mengeluh tentang hal itu. Jika saya hanya menghilangkandynamic_cast
maka itu mengkompilasi dengan baik; apa tujuandynamic_cast
layanan dalam kasus ini? Kami sudah membuatostringstream
, jadi mengapa melemparkannya?ostringstream
, kita disebutoperator<<()
di atasnya, yang kembaliostream &
- yang.str()
tidak didefinisikan. Saya benar-benar bertanya-tanya bagaimana dentang akan membuat ini bekerja tanpa para pemain (atau mengapa itu menghasilkan kesalahan dengan itu). Konstruk ini diterbitkan di banyak tempat, dan saya telah menggunakannya selama lebih dari satu dekade pada banyak kompiler yang berbeda, termasuk MSVC, GCC, dan XLC, jadi saya agak terkejut dengan dentingan balk.do { } while( 0 )
tidak akan menambahkan apa pun. Dengan 2. dan 3. Anda mungkin mendapat poin - ini bisa dilakukan dengan pemeran statis, dan mungkin salah satu dari Anda penyihir templat di luar sana bisa muncul dengan antarmuka "lebih bagus". Tapi seperti yang saya katakan, ini bukan penemuan saya sendiri. Lihat-lihat, makro (makro!) Ini cukup di mana-mana. Itu adalah kasus POLA itu sendiri. Saya mungkin mempermainkan ini sedikit untuk membuatnya lebih "efisien".Saya biasanya menggunakan metode berikut:
Dijelaskan secara rinci di sini .
sumber
ss
, Anda perlu melakukannyass.clear()
. Saya telah melihat hasil yang tidak terduga tanpa inisialisasi ini.clear()
yang baru dibuatostringstream
.clear()
me-reset flag kesalahan / eof, dan belum ada kondisi error / eof yang dihasilkanNumberToString(23213.123)
menghasilkan23213.1
sambilstd::to_string(23213.123)
menghasilkan23213.123000
Apa yang terjadi di sana?Mungkin cara paling mudah yang paling umum adalah membungkus pilihan kedua Anda ke dalam templat bernama
lexical_cast
, seperti yang ada di Boost , sehingga kode Anda terlihat seperti ini:Satu kebaikan dari ini adalah bahwa ia mendukung gips lain juga (misalnya, dalam arah yang berlawanan berfungsi juga).
Perhatikan juga bahwa meskipun Lexical_cast Boost dimulai sebagai hanya menulis ke stringstream, kemudian mengekstrak kembali dari aliran, sekarang memiliki beberapa tambahan. Pertama-tama, spesialisasi untuk beberapa jenis telah ditambahkan, jadi untuk banyak jenis umum, ini jauh lebih cepat daripada menggunakan stringstream. Kedua, sekarang memeriksa hasilnya, jadi (misalnya) jika Anda mengonversi dari string ke
int
, ia dapat melempar pengecualian jika string berisi sesuatu yang tidak dapat dikonversi keint
(misalnya,1234
akan berhasil, tetapi123abc
akan melempar) .Pada C ++ 11, ada
std::to_string
fungsi kelebihan untuk tipe integer, sehingga Anda dapat menggunakan kode seperti:Standar mendefinisikan ini sebagai setara dengan melakukan konversi dengan
sprintf
(menggunakan specifier konversi yang cocok dengan jenis objek yang disediakan, seperti%d
untukint
), ke dalam buffer dengan ukuran yang cukup, kemudian membuatstd::string
konten buffer tersebut.sumber
Jika Anda telah memasang Boost (yang seharusnya):
sumber
Akan lebih mudah menggunakan stringstreams:
Atau buat fungsi:
sumber
Bukan yang saya tahu, di C + + murni. Namun sedikit modifikasi dari apa yang Anda sebutkan
harus bekerja, dan itu cukup singkat.
sumber
itoa()
bukan fungsi standar!Anda dapat menggunakan yang
std::to_string
tersedia di C ++ 11 seperti yang disarankan oleh Matthieu M .:Atau, jika kinerja sangat penting (misalnya, jika Anda melakukan banyak konversi), Anda dapat menggunakan
fmt::format_int
dari perpustakaan {fmt} untuk mengonversi integer menjadistd::string
:Atau string C:
Yang terakhir ini tidak melakukan alokasi memori dinamis dan lebih dari 10 kali lebih cepat daripada
std::to_string
pada benchmark Boost Karma. Lihat Konversi integer cepat ke string dalam C ++ untuk detail lebih lanjut.Perhatikan bahwa keduanya aman.
Tidak seperti
std::to_string
,fmt::format_int
tidak memerlukan C ++ 11 dan bekerja dengan kompiler C ++.Penafian: Saya penulis perpustakaan {fmt}.
sumber
c_str()
mengembalikan pointer ke buffer yang dideklarasikan di dalamfmt::FormatInt
kelas - sehingga pointer yang dikembalikan tidak valid pada titik koma - lihat juga stackoverflow.com/questions/4214153/lifetime-of-temporariesstd::string::c_str()
(demikian penamaan). Jika Anda ingin menggunakannya di luar ekspresi penuh, buat sebuah objek.FormatInt f(42);
Lalu, Anda dapat menggunakannyaf.c_str()
tanpa bahaya dihancurkan.sprintf()
cukup bagus untuk konversi format. Anda kemudian dapat menetapkan string C yang dihasilkan ke string C ++ seperti yang Anda lakukan pada 1.sumber
NULL
ukuran a dan nol untuk mendapatkan ukuran buffer yang diperlukan.snprintf
(perhatikan awalan SNP ) dansprintf
(perhatikan awalan SP ). Anda meneruskan ukuran ke yang pertama, dan itu berhati-hati untuk tidak meluap, namun yang terakhir tidak tahu ukuran buffer dan dengan demikian dapat meluap.snprintf
varian pertama dansprintf
varian setelah itu. Karena ukuran buffer diketahui saat itu, panggilansprintf
menjadi sepenuhnya aman.Pertama termasuk:
Kedua, tambahkan metode:
Gunakan metode seperti ini:
atau
sumber
Menggunakan stringstream untuk konversi angka berbahaya!
Lihat http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ di mana ia memberi tahu bahwa
operator<<
sisipan keluaran terformat.Bergantung pada lokasi Anda saat ini, bilangan bulat yang lebih besar dari 3 digit, dapat dikonversi menjadi string 4 digit, menambahkan pemisah ribuan tambahan.
Misal,
int = 1000
bisa jadi convertet menjadi string1.001
. Ini bisa membuat operasi perbandingan tidak berfungsi sama sekali.Jadi saya sangat merekomendasikan menggunakan
std::to_string
cara. Lebih mudah dan melakukan apa yang Anda harapkan.Diperbarui (lihat komentar di bawah) :
sumber
std::to_string
menggunakan lokal saat ini (lihat en.cppreference.com/w/cpp/string/basic_string/to_string , bagian 'Catatan'). Hampir semua alat standar (dari stringstreams kesprintf
, tetapi jugasscanf
dll) menggunakan lokal saat ini. Saya tidak menyadari hal ini sampai baru-baru ini ketika itu memukul saya dengan keras. Saat ini menggunakan barang buatan sendiri, tidak sulit untuk dibuat.Untuk C ++ 98 , ada beberapa opsi:
boost/lexical_cast
Boost bukan bagian dari pustaka C ++, tetapi mengandung banyak ekstensi pustaka yang bermanfaat.
Adapun runtime,
lexical_cast
operasi membutuhkan sekitar 80 mikrodetik (pada mesin saya) pada konversi pertama, dan kemudian mempercepat setelah itu jika dilakukan secara berlebihan.itoa
Ini berarti bahwa
gcc
/g++
tidak dapat mengkompilasi kode menggunakanitoa
.Tidak ada runtime untuk dilaporkan. Saya tidak menginstal Visual Studio, yang dilaporkan dapat dikompilasi
itoa
.sprintf
sprintf
adalah fungsi pustaka standar C yang bekerja pada string C, dan merupakan alternatif yang benar-benar valid.The
stdio.h
sundulan mungkin tidak diperlukan. Sedangkan untuk runtime,sprintf
operasi membutuhkan sekitar 40 mikrodetik (pada mesin saya) pada konversi pertama, dan kemudian mempercepat setelah itu jika dilakukan secara berlebihan.stringstream
Ini adalah cara utama pustaka C ++ untuk mengonversi bilangan bulat menjadi string, dan sebaliknya. Ada fungsi saudara serupa dengan
stringstream
yang selanjutnya membatasi penggunaan yang dimaksudkan aliran, sepertiostringstream
. Menggunakanostringstream
secara khusus memberi tahu pembaca kode Anda bahwa Anda hanya bermaksud menggunakan<<
operator, pada dasarnya. Fungsi ini adalah yang paling penting untuk mengonversi bilangan bulat menjadi string. Lihat pertanyaan ini untuk diskusi lebih lanjut.Adapun runtime,
ostringstream
operasi membutuhkan sekitar 71 mikrodetik (pada mesin saya), dan kemudian mempercepat setelah itu jika dilakukan secara berlebihan, tetapi tidak sebanyak fungsi sebelumnya .Tentu saja ada opsi lain, dan Anda bahkan dapat membungkus salah satu dari ini ke dalam fungsi Anda sendiri, tetapi ini menawarkan tampilan analitis pada beberapa yang populer.
sumber
C ++ 17 menyediakan std :: to_chars sebagai alternatif independen-lokal berkinerja tinggi.
sumber
Agak mudah untuk menambahkan beberapa gula sintaksis yang memungkinkan seseorang untuk menyusun string dengan cepat dengan cara seperti aliran
Sekarang Anda dapat menambahkan apa pun yang Anda inginkan (asalkan ada operator
<< (std::ostream& ..)
yang ditentukan untuknya)strmake()
dan menggunakannya sebagai penggantistd::string
.Contoh:
sumber
Diedit. Jika Anda membutuhkan cepat konversi integer dengan jumlah tetap digit ke char * kiri-empuk dengan '0' , ini adalah contoh untuk arsitektur little-endian (semua x86, x86_64 dan lain-lain):
Jika Anda mengonversi nomor dua digit:
Jika Anda mengonversi angka tiga digit:
Jika Anda mengonversi angka empat digit:
Demikian seterusnya hingga tujuh digit angka. Dalam contoh ini
n
adalah bilangan bulat yang diberikan. Setelah konversi itu representasi string dapat diakses sebagai(char*)&s
:CATATAN: Jika Anda membutuhkannya pada pesanan byte big-endian, meskipun saya tidak mengujinya, tetapi di sini adalah sebuah contoh: untuk nomor tiga digit itu
int32_t s = 0x00303030 | (n/100)<< 24 | (n/10%10)<<16 | (n%10)<<8;
untuk nomor empat digit (lengkungan 64 bit):int64_t s = 0x0000000030303030 | (n/1000)<<56 | (n/100%10)<<48 | (n/10%10)<<40 | (n%10)<<32;
Saya pikir itu harus bekerja.sumber
Menggunakan:
sumber
Saya menggunakan:
Ia bekerja pada kompiler Windows dan Linux g ++ saya.
sumber
sprintf
adalah yang terkenal untuk memasukkan data apa pun ke dalam string format yang diperlukan.Anda dapat mengubah
char *
array menjadi string seperti yang ditunjukkan pada baris ketiga.sumber
Ini bekerja untuk saya -
Kode saya:
sumber
stringstream
?std::to_string()
using namespace std;
:)C ++ 11 diperkenalkan
std::to_string()
untuk tipe numerik:sumber
Menggunakan:
sumber
sumber
Jika Anda menggunakan MFC , Anda dapat menggunakan
CString
:sumber
sumber
Anda sekarang dapat menggunakan
to_string(5)
.sumber
std
namespace juga bukan sesuatu yang harus Anda lakukan. Selain itu, sepertinya tidak_MAX_INT_DIG
merupakan makro standar, jadi jika didefinisikan secara salah, kode ini memiliki potensi besar untuk menginduksi perilaku yang tidak terdefinisi. -1Saya pikir menggunakan
stringstream
cukup mudah:sumber
Anda menggunakan tipe konter algoritma untuk mengkonversi ke string. Saya mendapatkan teknik ini dari pemrograman Commodore 64 komputer. Ini juga bagus untuk pemrograman game.
Anda mengambil bilangan bulat dan mengambil setiap digit yang diberi bobot oleh kekuatan 10. Jadi anggap bilangan bulat adalah 950.
Jika bilangan bulat sama dengan atau lebih besar dari 100.000 maka kurangi 100.000 dan tambah penghitung dalam string di ["000000"];
terus melakukannya sampai tidak ada lagi angka di posisi 100.000. Jatuhkan kekuatan sepuluh lainnya.
Jika bilangan bulat sama dengan atau lebih besar dari 10.000 maka kurangi 10.000 dan tambah penghitung dalam string pada ["000000"] +1 posisi;
terus lakukan sampai tidak ada lagi angka di posisi 10.000.
Jatuhkan kekuatan sepuluh lainnya
Saya tahu 950 terlalu kecil untuk digunakan sebagai contoh, tetapi saya harap Anda mendapatkan idenya.
sumber