std::getline()
sollte verwendet werden, wenn die erwarteten Eingaben des Programms von einem interaktiven Terminal kommen.
Das ist, was std::getline()
tut: es liest Text bis zum Newline-Zeichen. operator>>
tut das nicht, das ist es, was std::getline()
tut, und das sollte verwendet werden, um eine Zeile mit typisiertem Text zu verarbeiten. Verwenden Sie das richtige Werkzeug für den richtigen Job.
Leider viele C++ Bücher und Tutorials vorstellen >>
zu früh, vor std::getline()
Einführung und verwenden es in ihren Beispielen, einfach weil es einfacher und bequemer >>
behandeln die erforderliche Datentypumwandlung zu haben. Leider führt dies zu einer falschen Denkweise, bei der angenommen wird, dass >>
die automatische Wahl für die Verarbeitung von interaktiven Eingaben ist. Es ist nicht.
Der korrekte Ansatz ist die Verwendung std::getline()
. Erstellen Sie dann, falls erforderlich, eine std::istringstream
, und verwenden Sie diese, um alle Typumwandlungen von der eingegebenen Eingabe zu verarbeiten. Dies löst nicht nur das unmittelbare Problem, sondern löst auch das Problem der nicht plausiblen Eingabe, die std::cin
in einen fehlerhaften Zustand versetzt, wobei alle nachfolgenden versuchten Eingabe-Konvertierungen ebenfalls fehlschlagen - das ist ein weiterer häufiger Fehler.
So verwenden std::getline()
, zuerst:
std::istringstream i(line);
durch eine Schleife wiederholt Gefolgt:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
int main(void) {
std::cout << "Enter 4 words:" << endl;
std::string line;
std::getline(std::cin, line);
Und jetzt, sobald die Textzeile eingegeben wird, kann es zu einem std::istringstream
umgewandelt werden Rufen Sie >>
auf, um die Wörter in dieser Zeile zu zählen. Diesen Teil können Sie selbst fertigstellen.
P.S.Ein weiterer häufiger Fehler ist using namespace std;
. You should not do that, as well. Je früher gute Programmierpraktiken erworben werden, desto leichter wird der nachfolgende Weg auf dem Weg in Richtung C++ - Guru-Ismus sein.
Wissen über [ 'std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline) und [' std :: istringstream'] (http : //en.cppreference.com/w/cpp/io/basic_istringstream) sollte hilfreich sein. –