2016-11-09 2 views
0

Lesen Wie dieses Programm funktionieren sollte:C++: mehrere Eingänge nur bis Ende der Leitung

Geben Sie 4 Wörter:

dies schlecht ist

Bad-Eingang.

und

Geben Sie 4 Wörter:

hallo Sie lieben es

Gute Eingang.

Wie ich es versucht:

#include <iostream> 
#include <string> 

using namespace std; 

int main(void) { 
    cout << "Enter 4 words:" << endl; 
    string a, b, c, d; 
    cin >> a >> b >> c >> d; 
} 

Es liest Eingabe nach Ende der Leitung, und ich kann nicht herausfinden, wie man es nur eine Zeile zu begrenzen. Kannst du mir bitte sagen, welche Funktion ich benutzen soll? Ich werde für jede Antwort sehr dankbar sein.

Danke euch allen!

+5

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. –

Antwort

1

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.

0

sollten Sie folgenden Befehl verwenden: std::getline() Dies ignorieren den eventuellen Raum als String Zitat endet und Sie können innerhalb einer Variablen den Wert speichern, dann sehen, wie viele Worte im Innern, die sind. Beispiel: std::getline (std::cin,name);