Karena pertanyaan ini ditanyakan setiap minggu, FAQ ini mungkin dapat membantu banyak pengguna.
Cara mengonversi integer menjadi string di C ++
cara mengubah string menjadi integer di C ++
cara mengonversi bilangan floating-point menjadi string di C ++
cara mengonversi string menjadi bilangan floating-point di C ++
Jawaban:
Pembaruan untuk C ++ 11
Sebagai
C++11
standar, konversi string-ke-angka dan sebaliknya dibangun ke dalam pustaka standar. Semua fungsi berikut ada di<string>
(sesuai paragraf 21.5).string ke numerik
Masing-masing mengambil string sebagai masukan dan akan mencoba mengubahnya menjadi angka. Jika tidak ada nomor yang valid dapat dibuat, misalnya karena tidak ada data numerik atau nomor di luar kisaran untuk tipe tersebut, pengecualian dilemparkan (
std::invalid_argument
ataustd::out_of_range
).Jika konversi berhasil dan
idx
tidak0
,idx
akan berisi indeks dari karakter pertama yang tidak digunakan untuk decoding. Ini bisa menjadi indeks di belakang karakter terakhir.Akhirnya, tipe integral memungkinkan untuk menentukan basis, untuk angka yang lebih besar dari 9, alfabet diasumsikan (
a=10
sampaiz=35
). Anda dapat menemukan informasi selengkapnya tentang pemformatan tepat yang dapat diuraikan di sini untuk bilangan floating-point , bilangan bulat bertanda dan bilangan bulat tak bertanda .Terakhir, untuk setiap fungsi ada juga kelebihan beban yang menerima a
std::wstring
sebagai parameter pertamanya.numerik ke string
Ini lebih mudah, Anda meneruskan tipe numerik yang sesuai dan Anda mendapatkan string kembali. Untuk opsi pemformatan, Anda harus kembali ke opsi aliran string C ++ 03 dan menggunakan manipulator aliran, seperti yang dijelaskan dalam jawaban lain di sini.
Seperti dicatat dalam komentar, fungsi-fungsi ini kembali ke presisi mantissa default yang mungkin bukan presisi maksimum. Jika lebih presisi diperlukan untuk aplikasi Anda, sebaiknya kembali ke prosedur pemformatan string lainnya.
Ada juga fungsi serupa yang didefinisikan yang diberi nama
to_wstring
, ini akan mengembalikan astd::wstring
.sumber
std::to_string
kehilangan banyak presisi untuk tipe floating point. Misalnyadouble f = 23.4323897462387526; std::string f_str = std::to_string(f);
mengembalikan string 23,432390. Ini membuat tidak mungkin untuk membulatkan nilai floating point menggunakan fungsi ini.sprintf(buf, fmt, val)
dengan penentu format "% d " , "% u " , "% ld " , " % lu " , "% lld " , "% llu " , "% f " , "% f " , atau "% Lf " , masing-masing, yangbuf
menunjukkan buffer karakter internal dengan ukuran yang memadai. " Saya telah melihat C99 standar untuk printf dan saya berpikir bahwa jumlah tempat desimal tergantung pada difloat.h .#define DECIMAL_DIG
Cara mengubah angka menjadi string di C ++ 03
itoa
atauitof
fungsi karena mereka adalah non-standar dan karena itu tidak portabel.Gunakan aliran string
Perhatikan bahwa Anda dapat menggunakan aliran string juga untuk mengonversi angka floating-point menjadi string, dan juga untuk memformat string sesuai keinginan, seperti dengan
cout
Anda dapat menggunakan manipulator aliran, seperti
std::endl
,std::hex
dan fungsistd::setw()
,std::setprecision()
dll. Dengan aliran string dengan cara yang persis sama seperti dengancout
Jangan bingung
std::ostringstream
denganstd::ostrstream
. Yang terakhir tidak digunakan lagiGunakan boost lexical cast . Jika Anda tidak terbiasa dengan boost, ada baiknya Anda memulai dengan pustaka kecil seperti lexical_cast ini. Untuk mengunduh dan menginstal boost dan dokumentasinya buka di sini . Meskipun peningkatan tidak ada dalam standar C ++, banyak pustaka peningkatan menjadi standar pada akhirnya dan dorongan secara luas dianggap sebagai pustaka C ++ terbaik.
Pemeran leksikal menggunakan aliran di bawahnya, jadi pada dasarnya opsi ini sama dengan yang sebelumnya, hanya kurang bertele-tele.
Cara mengonversi string menjadi angka di C ++ 03
Opsi paling ringan, diwarisi dari C, adalah fungsi
atoi
(untuk bilangan bulat (alfabet ke bilangan bulat)) danatof
(untuk nilai floating-point (menurut abjad ke pelampung)). Fungsi-fungsi ini mengambil string gaya-C sebagai argumen (const char *
) dan oleh karena itu penggunaannya dapat dianggap sebagai praktik C ++ yang tidak terlalu baik. cplusplus.com memiliki dokumentasi yang mudah dipahami tentang atoi dan atof termasuk bagaimana mereka berperilaku jika terjadi masukan yang buruk. Namun tautan tersebut berisi kesalahan dalam hal menurut standar jika nomor masukan terlalu besar untuk muat dalam jenis target, perilaku tidak ditentukan.Gunakan aliran string (kali ini aliran string masukan,
istringstream
). Sekali lagi, istringstream digunakan seperticin
. Sekali lagi, jangan bingungistringstream
denganistrstream
. Yang terakhir tidak digunakan lagi.Gunakan boost lexical cast .
Jika ada masukan yang buruk,
lexical_cast
akan muncul pengecualian tipeboost::bad_lexical_cast
sumber
atoi
tidak bagus, itu salah. Gagal menyebutkan bahwa jika nilai numerik dari string tidak dapat direpresentasikanint
, maka perilakunya tidak ditentukan. Sebaliknya dikatakan bahwa nilai di luar jangkauan dijepit keINT_MAX
/INT_MIN
, yang tidak dapat saya temukan di C ++ 03 atau C89. Untuk input yang tidak tepercaya / tidak diverifikasi, atau saat menangani basis yang tidak didukung oleh aliran, Anda memerlukannyastrtol
, yang telah menentukan perilaku kesalahan. Dan komentar serupa untukatof
/strtod
.(int)strtol(nptr, (char **)NULL, 10)
. Fungsi atoi [...] mengembalikan nilai yang dikonversi.". cplusplus.com dikenal sebagai sumber informasi buruk yang luar biasa untuk pemula.istr >> i1 >> f >> i2;
sangat merindukan cek kesuksesan.std::to_string
Di C ++ 17, fungsi baru std :: to_chars dan std :: from_chars diperkenalkan di header charconv .
Dari std :: to_chars , sama untuk std :: from_chars .
Meskipun tidak sepenuhnya diimplementasikan oleh kompiler, itu pasti akan diimplementasikan.
sumber
Saya mencuri kelas nyaman ini dari suatu tempat di sini di StackOverflow untuk mengonversi apa pun yang dapat dialirkan ke string:
Dan kemudian Anda menggunakannya sebagai;
Cukup bagus!
Juga saya menggunakan fungsi ini untuk mengubah string menjadi apa pun yang dapat dialirkan, meskipun tidak terlalu aman jika Anda mencoba mengurai string yang tidak berisi angka; (dan itu juga tidak secerdas yang terakhir)
Digunakan sebagai:
Anda mungkin juga menginginkan versi untuk wstrings.
sumber