Saya mencoba mempelajari C ++ sejak kemarin dan saya menggunakan dokumen ini: http://www.cplusplus.com/files/tutorial.pdf (halaman 32). Saya menemukan kode di dokumen dan saya menjalankannya. Saya mencoba memasukkan Rs 5,5 untuk harga dan bilangan bulat untuk kuantitas dan hasilnya adalah 0. Saya mencoba memasukkan 5,5 dan 6 dan hasilnya benar.
// stringstreams
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main ()
{
string mystr;
float price = 0;
int quantity = 0;
cout << "Enter price: ";
getline (cin,mystr);
stringstream(mystr) >> price;
cout << "Enter quantity: ";
getline (cin,mystr);
stringstream(mystr) >> quantity;
cout << "Total price: " << price*quantity << endl;
return 0;
}
Pertanyaan: Apa sebenarnya yang dilakukan perintah mystring? Mengutip dari dokumen:
"Dalam contoh ini, kami memperoleh nilai numerik dari input standar secara tidak langsung. Alih-alih mengekstraksi nilai numerik langsung dari input standar, kami mendapatkan baris dari input standar (cin) ke dalam objek string (mystr), lalu kami mengekstrak integer nilai dari string ini menjadi variabel berjenis int (kuantitas). "
Kesan saya adalah bahwa fungsinya akan mengambil bagian integral dari string dan menggunakannya sebagai input.
(Saya tidak tahu persis bagaimana mengajukan pertanyaan di sini. Saya juga baru dalam pemrograman) Terima kasih.
stringstream
digunakan seperti itu. Saya biasanya memuat baris, mengubahnya dan kemudian mengekstraknya berdasarkan bagian, namun ini jelas memiliki sedikit keuntungan di sini karenacin
sudah menjadi aliran input ... Jadicin >> price >> quantity;
akan jauh lebih sederhana. Itu akan menjadi alasan yang bagus untuk TIDAK menggunakan tutorial cplusplus.com.stringstream
kerjanya. Ini aneh bahkan mungkin buruk =) Tapi ini menunjukkan Anda dapat memperlakukan string sebagai aliran.stringstream
maka itu pasti contoh yang salah. Dan bahkan jika itu maka harus ditulis berbeda.Jawaban:
Terkadang sangat mudah menggunakan stringstream untuk mengonversi antara string dan tipe numerik lainnya. Penggunaannya
stringstream
mirip dengan penggunaaniostream
, sehingga tidak menjadi beban untuk belajar.Stringstream dapat digunakan untuk membaca string dan menulis data ke dalam string. Ini terutama berfungsi dengan buffer string, tetapi tanpa saluran I / O nyata.
Fungsi anggota dasar dari kelas stringstream adalah
str()
, yang mengembalikan konten buffernya dalam tipe string.str(string)
, yang menyetel konten buffer ke argumen string.Berikut adalah contoh cara menggunakan aliran string.
Hasilnya adalah
dec: 15 hex: f
.istringstream
kurang lebih penggunaannya sama.Singkatnya, stringstream adalah cara mudah untuk memanipulasi string seperti perangkat I / O independen .
FYI, hubungan pewarisan antar kelas adalah:
sumber
Untuk menjawab pertanyaan itu.
stringstream
pada dasarnya memungkinkan Anda untuk memperlakukanstring
objek sepertistream
, dan menggunakan semuastream
fungsi dan operator di atasnya.Saya melihatnya digunakan terutama untuk kebaikan output / input yang diformat.
Salah satu contoh yang baik adalah
c++
implementasi konversi angka menjadi objek aliran.Contoh yang memungkinkan:
Mungkin agak rumit tapi cukup rumit. Anda membuat
stringstream
objekss
, memodifikasi benderanya, memasukkan nomor ke dalamnyaoperator<<
, dan mengekstraknya melaluistr()
. Saya rasa ituoperator>>
bisa digunakan.Juga dalam contoh ini
string
buffer disembunyikan dan tidak digunakan secara eksplisit. Tapi itu akan menjadi posting yang terlalu panjang untuk ditulis tentang setiap aspek yang mungkin dan kasus penggunaan.Catatan: Saya mungkin mencurinya dari seseorang di SO dan disempurnakan, tetapi saya tidak memiliki catatan penulis asli.
sumber
ret
tidak perlu, seseorang bisa menulisreturn ss.str();
.Dari C ++ Primer :
Saya menemukan beberapa kasus di mana nyaman dan ringkas untuk menggunakan stringstream .
kasus 1
Ini dari salah satu solusi untuk masalah leetcode ini . Ini mendemonstrasikan kasus yang sangat cocok dimana penggunaan stringstream efisien dan ringkas.
Misalkan
a
danb
merupakan bilangan kompleks yang diekspresikan dalam format string, kita ingin mendapatkan hasil perkaliana
danb
juga dalam format string. Kodenya adalah sebagai berikut:kasus 2
Ini juga dari masalah leetcode yang mengharuskan Anda untuk menyederhanakan string jalur yang diberikan, salah satu solusi menggunakan stringstream adalah yang paling elegan yang pernah saya lihat:
Tanpa penggunaan stringstream, akan sulit untuk menulis kode yang begitu ringkas.
sumber
Anda memasukkan alfanumerik dan int, dipisahkan dengan kosong
mystr
.Anda kemudian mencoba mengonversi token pertama (dibatasi kosong) menjadi
int
.Token pertama adalah RS yang gagal untuk dikonversi
int
, menyisakan nol untuk myprice, dan kita semua tahu berapa hasil nol dikalikan.Saat Anda hanya memasukkan nilai int untuk kedua kalinya, semuanya bekerja seperti yang Anda harapkan.
Itu RS palsu yang menyebabkan kode Anda gagal.
sumber