Basic String-Eingabe

8

Ich bin neu hier so nackt mit mir. Ich bin gerade auf diesen Codeabschnitt gestoßen, mit dem Benutzer Zeichenfolgen an der Eingabeaufforderung eingeben können. Ich bin mir bewusst, was sie tun und es ist alles großartig. Aber ich habe eine Frage in Bezug auf die Funktionen cin und getline ().

%Vor%

Nun, wenn dies ausgegeben wird, bekomme ich etwas in der Art von: (mit John Smith als Eingabe)

%Vor%

Ich verstehe, warum dies passiert, die getline liest immer noch aus dem Eingabepuffer und ich weiß, wie ich es beheben kann. Meine Frage ist, warum gibt es keine neue Zeile nach dem "Bitte geben Sie Ihren vollständigen Namen noch einmal ein"? Wenn ich den Code ändere:

%Vor%

Plötzlich bekomme ich einen Zeilenumbruch, nachdem Sie Ihren vollen Namen erneut eingegeben haben. Es ist nicht wirklich ein großes Problem, um ehrlich zu sein. Aber ich hätte nichts dagegen zu wissen, was passiert ist, wenn mir jemand helfen kann. Danke!

    
user2779581 14.09.2013, 16:29
quelle

1 Antwort

6

Wenn Sie "John Smith" als Eingabe eingeben, wird cin >> name nicht die gesamte Zeile lesen, sondern den Inhalt der Zeile bis zum ersten Leerzeichen.

Nach der ersten cin enthält die Namensvariable John . Es wird immer noch Smith\n im Puffer geben, und Sie haben das gelöst mit:

%Vor%

Hinweis: Wie Konrad Rudolph vorgeschlagen hat, sollten Sie in Ihrem Code wirklich keine 256 oder andere magische Zahlen verwenden. Verwenden Sie stattdessen std::numeric_limits<std::streamsize>::max() . Hier ist, was Docs über das erste Argument von istream::ignore sagt:

  

Maximale Anzahl von Zeichen, die extrahiert (und ignoriert) werden sollen.    Wenn dies genau numeric_limits<streamsize>::max() ist, gibt es kein Limit: Es werden so viele Zeichen wie benötigt extrahiert, bis delim (oder das Dateiende) gefunden wird.

%Vor%
  

Meine Frage ist, warum kommt nach dem "Bitte geben Sie noch einmal Ihren vollständigen Namen ein" keine neue Zeile?

Weil Sie keine Ausgabe an die Standardausgabe ausgeben und der Benutzer keine Chance erhält, die Eingabetaste zu drücken. getline liest Smith\n aus dem Puffer und wird sofort fortgesetzt. Es werden keine Newline-Zeichen in der Konsole angezeigt - getline macht das nicht.

  

Plötzlich bekomme ich einen Zeilenumbruch, nachdem Sie Ihren vollen Namen erneut eingegeben haben. Es ist nicht wirklich ein großes Problem, um ehrlich zu sein. Aber ich hätte nichts dagegen zu wissen, was passiert ist, wenn mir jemand helfen kann. Danke!

Es ist die neue Zeile, die user mit der Enter -Schlüsseleingabe eingibt, sie kommt nicht von Ihrem Programm.

Bearbeiten Das Drücken der Eingabetaste im Terminal führt normalerweise (abhängig von der Einrichtung des Terminals) zu wenig voneinander getrennten Dingen:

  1. Einfügen von \n in den Eingabepuffer
  2. Spülen des Eingabepuffers
  3. Verschieben des Eingabecursors um eine Zeile nach unten
  4. Bewegt den Eingabecursor an den Anfang der Zeile
Nemanja Boric 14.09.2013, 16:58
quelle

Tags und Links