2016-09-04 5 views
0

So fühle ich, dass ich kurz davor bin, eine Programmieraufgabe zu lösen, die das am häufigsten verwendete Wort jeder Zeile verwendet und es in einer Zeile ausgibt. So zum Beispiel:Warum hört dieser While-Loop nie auf?

I am a man, am right? 
I don't know if i like that. 
It's okay to not feel okay. 

Druck würde: „ich bin in Ordnung“ (Interpunktion und Fall sind für die Zuordnung ignoriert)

Dies ist, was ich bisher getan habe, aber das Problem ist, dass die while-Schleife das scannt die Zeilen nie beendet und daher nie die Ausgabe in der externen For-Schleife. Wer sieht wo ich falsch gelaufen bin?

string line; 
vector<string> result; 
while(getline(cin,line)){  //on each line 

} 
+0

Benötigen Sie wirklich _all_ diese Codezeilen, um dieses Problem zu reproduzieren? [MCVE] –

Antwort

1

Derzeit wartet Ihr Programm auf ein EOF-Zeichen, das anzeigt, dass die Eingabe beendet wurde. Wenn Sie dies ausführen und die Eingabe über die Befehlszeile eingeben, können Sie manuell eine EOF einfügen, indem Sie Strg + D auf * nix oder Strg + Z auf Windows drücken. Dies führt dazu, dass Ihr Programm aus Ihrer Getline-Schleife ausbricht.

Wenn Sie dies nicht tun möchten, müssen Sie einen Weg aus der getline-Schleife ausbrechen, sonst läuft es in dieser Schleife weiter.

Eine nette Idee könnte eine leere Zeile wird Detektieren der Enter-Taste zweimal so endet die Schleife:

while(getline(cin,line)){  //on each line 
    if(line == "") 
     break; 
    ... 
} 
+0

Gibt es eine Möglichkeit, dies zu tun, also ich nur die Eingabe eingeben, drücken Sie die Eingabetaste einmal und erhalten Sie das Ergebnis? –

+0

Ich gehe davon aus, dass Sie dies über die Befehlszeile eingeben (nach stdin), so dass jede Zeile mit dem Drücken der Eingabetaste beendet wird? Wenn dies der Fall ist, müssen Sie entscheiden, wie Sie zwischen einer neuen Zeile unterscheiden können, die bedeutet, dass Ihre Zeile vollständig ist, und Sie werden eine neue Zeile eingeben, und eine neue Zeile, die bedeutet, dass Sie fertig sind. – js441

+0

Der gesamte Absatz wird eingegeben und dann drücke Enter. Ich brauche einen Weg, damit Enter nur einmal gedrückt wird. Ich fühle mich so nahe! –

2

die Schleife korrekt geschrieben; Sie wissen einfach nicht, wie Sie das Ende der Eingabe angeben. Du sitzt da und wartest darauf, dass das Programm fortschreitet, aber das Programm sitzt dort und wartet darauf, dass du ihm mehr Input gibst.

Drücken Sie Strg + D (Linux) oder Strg + Z (Windows), um das EOF Zeichen/Signal/Trank zu senden, um die Schleife zu beenden.

Auf diese Weise funktionieren auch alle gängigen Shell-Techniken wie Dateiumleitung und Pipes.

Die Einführung künstlicher Mittel wie ein doppelter Zeilenumbruch oder ein magischer Befehl ist nicht konventionell und erschwert die Automatisierung Ihres Programms. (Und Ihr Programm magisch wissen, dass einer der Zeilenumbrüche von einem Tastaturbefehl kommt und nicht kopiert/eingefügt wird, ist einfach nicht möglich. Und Sie wollen es auch nicht! Das bricht eine Menge wertvoller Abstraktionen.) Beim Schreiben eines Befehls - Line-Tool, halten Sie sich so weit wie möglich an Standardpraktiken.

+0

Gibt es eine Möglichkeit, dies zu kodieren, ich brauche das nicht zu tun? Der Absatz wird sofort eingegeben, dann wird Enter gedrückt und das Ergebnis wird gedruckt. –

+0

@ Team.Coco: Das Programm hat keine Möglichkeit (und sollte keine Möglichkeit haben), zu wissen, dass die dritte Eingabe sich anders als die ersten beiden Eingaben verhalten soll, es sei denn, Sie wollen immer genau drei Zeilen akzeptieren. Was ich beschrieben habe, ist der richtige Weg, und es ist wirklich einfach! Sie scheinen darauf hinzuweisen, dass es eine Notlage ist; Ich bin mir nicht sicher warum. –

+0

Es gibt nur eine "Eingabe" durch den Benutzer. Der eingegebene Absatz wird sofort angegeben –

Verwandte Themen