Bagaimana saya dapat mengkonversi std::string ke int?
Punya pertanyaan cepat. I've melihat sekeliling internet cukup sedikit dan I've menemukan beberapa solusi tetapi tidak satupun dari mereka telah bekerja belum. Melihat mengkonversi string ke int dan saya don't maksud kode ASCII.
Untuk run-down cepat, kami diturunkan di sebuah persamaan sebagai string. Kita harus memecahnya, format dengan benar dan memecahkan persamaan linear. Sekarang, dengan mengatakan bahwa, saya'm tidak mampu mengkonversi string ke int.
Aku tahu bahwa string yang akan di format (-5) atau (25) dll. jadi itu's pasti int. Tapi bagaimana kita mengekstrak dari string?
Salah satu cara saya berpikir menjalankan for/while loop melalui string, periksa digit, ekstrak semua digit setelah itu dan kemudian melihat apakah ada yang terkemuka '-', jika ada, kalikan int dengan -1.
Tampaknya sedikit lebih rumit seperti masalah kecil sekalipun. Ada ide?
Dalam C++11 ada beberapa petobat baru fungsi dari
std::string
untuk sejumlah jenis.Jadi bukan
anda dapat menggunakan
di mana
str
ini sebagaistd::string
.Ada versi untuk semua rasa dari angka-angka:
lama stol(string)
,float stof(string)
,double stod(string)
,... lihat http://en.cppreference.com/w/cpp/string/basic_string/stolUntuk menjadi sepenuhnya benar anda'll ingin memeriksa kesalahan bendera.
gunakan atoi fungsi untuk mengkonversi string ke integer:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
Mungkin pilihan yang dijelaskan di bawah ini:
1. Pilihan pertama: sscanf()
Ini adalah sebuah kesalahan (juga ditunjukkan oleh cppcheck) karena "scanf tanpa lebar field batas-batas yang dapat kecelakaan besar dengan input data pada beberapa versi dari libc" (lihat di sini, dan di sini).
*2. Pilihan kedua: std::sto()**
Solusi ini lebih pendek dan elegan, tapi itu hanya tersedia pada C++11 compliants compiler.
3. Pilihan ketiga: sstreams
Namun, dengan solusi ini sulit untuk membedakan antara masukan buruk (lihat di sini).
4. Pilihan keempat: Meningkatkan's lexical_cast
Namun, ini adalah hanya sebuah bungkus sstream, dan dokumentasi menyarankan untuk menggunakan sstrem untuk kesalahan yang lebih baik manajemen (lihat di sini).
*5. Pilihan kelima: strto()**
Solusi ini sangat panjang, karena kesalahan manajemen, dan hal ini dijelaskan di sini. Karena tidak ada fungsi mengembalikan polos int, konversi diperlukan dalam kasus bilangan bulat (lihat di sini untuk cara konversi ini dapat dicapai).
6. Pilihan keenam: Qt
Kesimpulan
Menyimpulkan, solusi terbaik adalah C++11 std::stoi() atau, sebagai pilihan kedua, penggunaan perpustakaan Qt. Semua solusi lainnya adalah berkecil hati atau kereta.
Apa tentang Boost.Lexical_cast?
Berikut ini adalah contoh mereka:
Memang, solusi saya tidak't bekerja untuk bilangan bulat negatif, tapi itu akan mengekstrak semua bilangan bulat positif dari input teks yang berisi bilangan bulat. Itu membuat penggunaan
numeric_only
lokal:It's mungkin sedikit berlebihan, tapi
boost::lexical_cast<int>( theString )
harus untuk pekerjaan cukup baik.atoi
built-in fungsi yang mengkonversi string ke integer, dengan asumsi bahwa string yang dimulai dengan integer representasi.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
Dari http://www.cplusplus.com/reference/string/stoi/
Di Windows, anda bisa menggunakan:
Nah, banyak jawaban, banyak kemungkinan. Apa yang saya hilang di sini adalah beberapa metode universal yang mengkonversi string untuk berbagai C++ integral jenis (short, int, long, bool, ...). Saya datang dengan solusi berikut:
Berikut ini adalah contoh-contoh penggunaan:
Mengapa tidak hanya menggunakan stringstream output operator untuk mengkonversi string ke tipe integral? Berikut adalah jawabannya: Let's mengatakan string berisi nilai yang melebihi batas dimaksudkan untuk tipe integral. Untuk examle, pada Wndows 64 max int adalah 2147483647. Let's menetapkan serangkaian nilai max int + 1: string str = "2147483648". Sekarang, ketika mengkonversi string ke int:
x menjadi 2147483647, apa yang pasti sebuah kesalahan: string "2147483648" tidak seharusnya dikonversikan ke int 2147483647. Disediakan fungsi toIntegralType bintik-bintik kesalahan tersebut dan melempar pengecualian.
Salah satu line versi:
panjang n = strtol(s.c_str(), NULL, tempat);
.(
s
adalah string, dandasar
adalah sebuahint
seperti 2, 8, 10, 16.)Anda bisa lihat tautan ini untuk rincian lebih lanjut dari
strtol
.Inti idenya adalah untuk menggunakan
strtol
fungsi, yang termasuk dalamcstdlib
.Sejak
strtol
hanya menangani denganchar
array, kita perlu mengkonversistring
untukchar
array. Anda bisa lihat tautan ini.Contoh:
Kode Saya:
ada cara mudah lain : misalkan anda memiliki karakter seperti
c='4'
oleh karena itu anda dapat melakukan salah satu dari langkah-langkah ini :1 : int q
q=(int) c ; (q sekarang 52 dalam tabel ascii ) . q=q-48; ingat bahwa menambahkan 48 digit adalah kode ascii .
cara kedua :
q=c-'0'; sama , karakter '0' berarti 48