Pertanyaan Apa sebenarnya yang dilakukan stringstream?


Saya mencoba belajar 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 sebuah 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 oleh perintah mistik? Mengutip dari dokumen:

"Dalam contoh ini, kami memperoleh nilai numerik dari input standar   secara tidak langsung. Alih-alih mengekstrak nilai numerik langsung dari   input standar, kita mendapatkan garis dari input standar (cin) menjadi a   string object (mystr), dan kemudian kita mengekstrak nilai integer dari   string ini menjadi variabel bertipe int (kuantitas). "

Kesan saya adalah bahwa fungsi tersebut 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.


76
2017-12-15 12:31


asal


Jawaban:


Terkadang sangat mudah menggunakan stringstream untuk mengkonversi antara string dan tipe numerik lainnya. Penggunaan dari stringstream mirip dengan penggunaan iostream, jadi itu bukan beban untuk belajar.

Stringstream dapat digunakan untuk membaca string dan menulis data menjadi string. Ini terutama berfungsi dengan buffer string, tetapi tanpa saluran I / O nyata.

Fungsi anggota dasar dari kelas stringstream adalah

  • str(), yang mengembalikan isi buffer-nya dalam tipe string.

  • str(string), yang mengatur isi buffer ke argumen string.

Berikut ini contoh cara menggunakan string stream.

ostringstream os;
os << "dec: " << 15 << " hex: " << std::hex << 15 << endl;
cout << os.str() << endl;

Hasilnya adalah dec: 15 hex: f.

istringstream kurang lebih sama penggunaannya.

Untuk meringkas, stringstream adalah cara mudah memanipulasi string seperti perangkat I / O independen.

Untuk diketahui, hubungan pewarisan antara kelas adalah:

string stream classes


119
2017-12-15 13:28



Untuk menjawab pertanyaan itu. stringstream pada dasarnya memungkinkan Anda untuk memperlakukan string objek seperti stream, dan gunakan semuanya stream fungsi dan operator di dalamnya.

Saya melihatnya digunakan terutama untuk output / input yang diformat.

Satu contoh yang bagus c++ implementasi konversi angka ke stream objek.

Kemungkinan contoh:

template <class T>
string num2str(const T& num, unsigned int prec = 12) {
    string ret;
    stringstream ss;
    ios_base::fmtflags ff = ss.flags();
    ff |= ios_base::floatfield;
    ff |= ios_base::fixed;
    ss.flags(ff);
    ss.precision(prec);
    ss << num;
    ret = ss.str();
    return ret;
};

Mungkin agak rumit tetapi cukup rumit. Anda membuat stringstream obyek ss, modifikasi benderanya, masukkan angka ke dalamnya operator<<, dan ekstrak melalui str(). Saya rasa itu operator>> bisa digunakan.

Juga dalam contoh ini string buffer tersembunyi dan tidak digunakan secara eksplisit. Tetapi akan terlalu lama posting untuk menulis tentang setiap aspek yang mungkin dan use case.

Catatan: Saya mungkin mencurinya dari seseorang di SO dan disempurnakan, tetapi saya tidak memiliki catatan penulis asli.


15
2017-12-15 12:47



Dari C ++ Primer:

Itu aliran udara ketik membaca a tali, ostringstream tulis a tali, dan stringstream membaca dan menulis tali.

Saya menemukan beberapa kasus yang nyaman dan ringkas untuk digunakan stringstream.

kasus 1

Itu dari salah satu solusi untuk masalah leetcode ini. Ini menunjukkan kasus yang sangat cocok di mana penggunaan stringstream efisien dan ringkas.

Seharusnya a dan b adalah bilangan kompleks yang dinyatakan dalam format string, kami ingin mendapatkan hasil perkalian a dan b juga dalam format string. Kodenya adalah sebagai berikut:

string a = "1+2i", b = "1+3i";
istringstream sa(a), sb(b);
ostringstream out;

int ra, ia, rb, ib;
char buff;
// only read integer values to get the real and imaginary part of 
// of the original complex number
sa >> ra >> buff >> ia >> buff;
sb >> rb >> buff >> ib >> buff;

out << ra*rb-ia*ib << '+' << ra*ib+ia*rb << 'i';

// final result in string format
string result = out.str() 

kasus 2

Itu juga dari a masalah leetcode yang mengharuskan Anda menyederhanakan string jalur yang diberikan, salah satu solusi menggunakan stringstream adalah yang paling elegan yang pernah saya lihat:

string simplifyPath(string path) {
    string res, tmp;
    vector<string> stk;
    stringstream ss(path);
    while(getline(ss,tmp,'/')) {
        if (tmp == "" or tmp == ".") continue;
        if (tmp == ".." and !stk.empty()) stk.pop_back();
        else if (tmp != "..") stk.push_back(tmp);
    }
    for(auto str : stk) res += "/"+str;
    return res.empty() ? "/" : res; 
 }

Tanpa menggunakan stringstream, akan sulit untuk menulis kode ringkas seperti itu.


12
2018-06-27 14:22



Anda memasukkan alfanumerik dan int, kosong dalam batas mystr.

Anda kemudian mencoba mengonversi token pertama (blank delimited) menjadi int.

Token pertama adalah RS yang gagal dikonversi menjadi int, meninggalkan nol untuk myprice, dan kita semua tahu apa hasil nol kali apa pun.

Ketika Anda hanya memasukkan nilai int kedua kalinya, semuanya bekerja seperti yang Anda harapkan.

Itu adalah RS palsu yang menyebabkan kode Anda gagal.


2
2017-08-11 02:09