Punya pertanyaan singkat. Saya sudah melihat-lihat internet cukup banyak dan saya sudah menemukan beberapa solusi tetapi belum ada yang bekerja. Melihat mengkonversi string ke int dan saya tidak bermaksud kode ASCII.
Untuk run-down cepat, kita dilewatkan dalam persamaan sebagai string. Kita harus memecahnya, memformatnya dengan benar dan menyelesaikan persamaan linear. Sekarang, dengan mengatakan itu, saya tidak dapat mengubah string menjadi int.
Saya tahu bahwa string akan berada dalam format (-5) atau (25) dll. Jadi itu jelas int. Tapi bagaimana kita mengekstraknya dari string?
Salah satu cara yang saya pikirkan adalah menjalankan for / while loop melalui string, memeriksa digit, mengekstrak semua digit setelah itu dan kemudian melihat apakah ada '-' terkemuka, jika ada, kalikan int dengan - 1.
Tampaknya agak terlalu rumit untuk masalah kecil. Ada ide?
atoi()
?std::string
myString
, dan ingin menggunakanatoi
, maka Anda ingin mengatakanatoi(myString.c_str())
.Jawaban:
Di C ++ 11 ada beberapa fungsi konversi baru yang bagus dari
std::string
ke tipe angka.Jadi, bukannya
kamu bisa menggunakan
dimana
str
nomor kamu sebagaistd::string
.Ada versi untuk semua rasa dari nomor:
long stol(string)
,float stof(string)
,double stod(string)
, ... lihat http://en.cppreference.com/w/cpp/string/basic_string/stolsumber
"11x"
menjadi integer11
.from_chars
dari C ++ 17? Seharusnya perintah besarnya lebih cepat daristoi
.stoi
harus lebih disukai. Lihat Mengapa saya tidak harus menggunakan atoi ()?Agar benar sepenuhnya, Anda ingin memeriksa bendera kesalahan.
sumber
-5
dari(-5)
.Opsi yang mungkin dijelaskan di bawah ini:
1. Opsi pertama: sscanf ()
Ini adalah kesalahan (juga ditunjukkan oleh cppcheck) karena "scanf tanpa batas lebar bidang dapat macet dengan data input besar pada beberapa versi libc" (lihat di sini , dan di sini ).
2. Opsi kedua: std :: sto * ()
Solusi ini pendek dan elegan, tetapi hanya tersedia pada kompiler yang memenuhi C ++ 11.
3. Opsi ketiga: sstreams
Namun, dengan solusi ini sulit untuk membedakan antara input yang buruk (lihat di sini ).
4. Opsi keempat: Boost's lexical_cast
Namun, ini hanya pembungkus
sstream
, dan dokumentasi menyarankan untuk digunakansstream
untuk manajemen kesalahan yang lebih baik (lihat di sini ).5. Opsi kelima: strto * ()
Solusi ini sangat panjang, karena manajemen kesalahan, dan dijelaskan di sini. Karena tidak ada fungsi yang mengembalikan int polos, konversi diperlukan jika integer (lihat di sini bagaimana konversi ini dapat dicapai).
6. Opsi keenam: Qt
Kesimpulan
Kesimpulannya, solusi terbaik adalah C ++ 11
std::stoi()
atau, sebagai opsi kedua, penggunaan pustaka Qt. Semua solusi lain tidak disarankan atau bermasalah.sumber
gunakan fungsi atoi untuk mengonversi string menjadi integer:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
sumber
atoi
.strtol
melakukan segalanyaatoi
, tetapi lebih baik, dan gagal dengan aman.Bagaimana dengan Boost.Lexical_cast ?
Inilah contoh mereka:
sumber
Memang, solusi saya tidak akan berfungsi untuk bilangan bulat negatif, tetapi itu akan mengekstrak semua bilangan bulat positif dari teks input yang mengandung bilangan bulat. Itu menggunakan
numeric_only
lokal:Masukkan teks:
Bilangan bulat keluaran:
Kelas
numeric_only
didefinisikan sebagai:Demo online lengkap: http://ideone.com/dRWSj
sumber
Mungkin sedikit berlebihan, tetapi
boost::lexical_cast<int>( theString )
harus bekerja dengan baik.sumber
boost::lexical_cast<int>( theString )
(di manatheString
nama variabel yang berisi string yang ingin Anda konversiint
).atoi
adalah fungsi bawaan yang mengubah string menjadi integer, dengan asumsi bahwa string dimulai dengan representasi integer.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
sumber
atoi
, gunakanstrtol
saja.Di Windows, Anda dapat menggunakan:
strtol
,stringstream
perlu menentukan basis jika Anda perlu menafsirkan hexdecimal.sumber
Yah, banyak jawaban, banyak kemungkinan. Apa yang saya lewatkan di sini adalah beberapa metode universal yang mengubah string menjadi tipe integral C ++ yang berbeda (pendek, int, panjang, bool, ...). Saya datang dengan solusi berikut:
Berikut adalah contoh penggunaannya:
Mengapa tidak menggunakan operator output stringstream untuk mengubah string menjadi tipe integral? Inilah jawabannya: Katakanlah sebuah string berisi nilai yang melebihi batas untuk tipe integral yang dimaksudkan. Sebagai contoh, pada Wndows 64 max int adalah 2147483647. Mari kita berikan nilai string int max 1 +: string str = "2147483648". Sekarang, saat mengonversi string ke int:
x menjadi 2147483647, yang pasti merupakan kesalahan: string "2147483648" tidak seharusnya dikonversi ke int 2147483647. Fungsi yang disediakan untukIntegralType mengenali kesalahan tersebut dan melempar pengecualian.
sumber
Dari http://www.cplusplus.com/reference/string/stoi/
Keluaran:
2001, A Space Odyssey: 2001 and [, A Space Odyssey]
40c3: 16579
-10010110001: -1201
0x7f: 127
sumber
Kode Saya:
sumber
sumber
Untuk mengkonversi dari representasi string ke nilai integer, kita dapat menggunakan std :: stringstream.
jika nilai yang dikonversi di luar kisaran untuk tipe data integer, itu mengembalikan INT_MIN atau INT_MAX.
Juga jika nilai string tidak dapat direpresentasikan sebagai tipe data int yang valid, maka 0 dikembalikan.
Output: 50
Sesuai dengan output di atas, kita dapat melihatnya dikonversi dari nomor string ke angka integer.
Sumber dan lainnya di string ke int c ++
sumber
Versi satu baris:
long n = strtol(s.c_str(), NULL, base);
.(
s
adalah string, danbase
merupakanint
seperti 2, 8, 10, 16.)Anda dapat merujuk ke tautan ini untuk perincian lebih lanjut tentang
strtol
.Gagasan intinya adalah menggunakan
strtol
fungsi, yang termasuk dalamcstdlib
.Karena
strtol
hanya menangani denganchar
array, kita perlu mengonversistring
kechar
array. Anda bisa merujuk ke tautan ini .Sebuah contoh:
yang akan menghasilkan:
sumber
ada cara mudah lainnya: misalkan Anda memiliki karakter seperti
c='4'
itu maka Anda dapat melakukan salah satu dari langkah-langkah ini:1: int q
q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .
cara kedua:
q=c-'0'; the same , character '0' means 48
sumber
string
menjadiint
daripada darichar
kestring
.