Ich versuche seit gestern C ++ zu lernen und verwende dieses Dokument: http://www.cplusplus.com/files/tutorial.pdf (Seite 32). Ich habe einen Code im Dokument gefunden und ihn ausgeführt. Ich habe versucht, Rs 5,5 für den Preis und eine Ganzzahl für die Menge einzugeben, und die Ausgabe war 0. Ich habe versucht, 5,5 und 6 einzugeben, und die Ausgabe war korrekt.
// 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;
}
Frage: Was genau macht der Befehl mystring? Zitat aus dem Dokument:
"In diesem Beispiel erfassen wir numerische Werte indirekt aus der Standardeingabe. Anstatt numerische Werte direkt aus der Standardeingabe zu extrahieren, erhalten wir Zeilen aus der Standardeingabe (cin) in ein Zeichenfolgenobjekt (mystr) und extrahieren dann die Ganzzahl Werte aus dieser Zeichenfolge in eine Variable vom Typ int (Menge). "
Mein Eindruck war, dass die Funktion den integralen Bestandteil eines Strings als Eingabe verwendet.
(Ich weiß nicht genau, wie ich hier eine Frage stellen soll. Ich bin auch neu in der Programmierung.) Danke.
stringstream
. Normalerweise lade ich die Zeile, konvertiere sie und extrahiere sie dann nach Teilen, aber das hat hier offensichtlich wenig Vorteil, dacin
es sich bereits um einen Eingabestream handelt ... Dascin >> price >> quantity;
wäre also weitaus einfacher. Das wäre ein guter Grund , cplusplus.com-Tutorials NICHT zu verwenden.stringstream
funktioniert. Es ist eine bizarre, wahrscheinlich sogar eine schlechte =) Aber es zeigt, dass Sie String als Stream behandeln können.stringstream
dann ist es definitiv ein falsches Beispiel. Und selbst wenn es so ist, sollte es anders geschrieben werden.Antworten:
Manchmal ist es sehr praktisch, Stringstream zu verwenden, um zwischen Strings und anderen numerischen Typen zu konvertieren. Die Verwendung von
stringstream
ähnelt der Verwendung voniostream
, daher ist das Lernen keine Belastung.Stringstreams können sowohl zum Lesen von Strings als auch zum Schreiben von Daten in Strings verwendet werden. Es funktioniert hauptsächlich mit einem String-Puffer, jedoch ohne echten E / A-Kanal.
Die grundlegenden Elementfunktionen der Stringstream-Klasse sind
str()
, der den Inhalt seines Puffers im Zeichenfolgentyp zurückgibt.str(string)
, die den Inhalt des Puffers auf das String-Argument setzen.Hier ist ein Beispiel für die Verwendung von String-Streams.
Das Ergebnis ist
dec: 15 hex: f
.istringstream
ist von mehr oder weniger gleichem Nutzen.Zusammenfassend ist Stringstream eine bequeme Möglichkeit, Strings wie ein unabhängiges E / A-Gerät zu bearbeiten .
Zu Ihrer Information, die Vererbungsbeziehungen zwischen den Klassen sind:
quelle
Um die Frage zu beantworten.
stringstream
Grundsätzlich können Sie einstring
Objekt wie ein Objekt behandelnstream
und allestream
Funktionen und Operatoren darauf verwenden.Ich habe gesehen, dass es hauptsächlich für die formatierte Ausgabe- / Eingabegüte verwendet wird.
Ein gutes Beispiel wäre die
c++
Implementierung der Konvertierung von Zahlen in Stream-Objekte.Mögliches Beispiel:
Vielleicht ist es ein bisschen kompliziert, aber es ist ziemlich komplex. Sie erstellen ein
stringstream
Objektss
, ändern seine Flags, geben eine Zahl einoperator<<
und extrahieren es überstr()
. Ich denke, dasoperator>>
könnte genutzt werden.Auch in diesem Beispiel ist der
string
Puffer ausgeblendet und wird nicht explizit verwendet. Aber es wäre zu lang, um über jeden möglichen Aspekt und Anwendungsfall zu schreiben.Hinweis: Ich habe es wahrscheinlich jemandem auf SO gestohlen und verfeinert, aber ich habe keinen Originalautor notiert.
quelle
ret
ist unnötig, man könnte schreibenreturn ss.str();
.Von C ++ Primer :
Ich stoße auf einige Fälle, in denen die Verwendung von Stringstream sowohl bequem als auch prägnant ist .
Fall 1
Es ist eine der Lösungen für dieses Leetcode-Problem . Es zeigt einen sehr geeigneten Fall, in dem die Verwendung von Stringstream effizient und präzise ist.
Angenommen
a
undb
komplexe Zahlen im String - Format ausgedrückt, wollen wir das Ergebnis der Multiplikation von erhaltena
undb
auch im String - Format. Der Code lautet wie folgt:Fall 2
Aufgrund eines Leetcode-Problems , bei dem Sie die angegebene Pfadzeichenfolge vereinfachen müssen, ist eine der Lösungen, die stringstream verwenden, die eleganteste, die ich je gesehen habe:
Ohne die Verwendung von Stringstream wäre es schwierig, solch prägnanten Code zu schreiben.
quelle
Sie haben eine alphanumerische und eine int-Leerzeichen eingegeben
mystr
.Sie haben dann versucht, das erste Token (durch Leerzeichen getrennt) in ein Token umzuwandeln
int
.Das erste Token war RS, das nicht konvertiert werden
int
konnte und eine Null für myprice hinterließ, und wir alle wissen, was null mal irgendetwas ergibt.Wenn Sie erst beim zweiten Mal int-Werte eingegeben haben, hat alles wie erwartet funktioniert.
Es war die falsche RS, die dazu führte, dass Ihr Code fehlschlug.
quelle