C++: Wie überprüfe ich, ob der Cin-Puffer leer ist?

Lesezeit: 3 Minuten

Benutzer-Avatar
Matt Shindala

Wie überprüfen Sie, ob der Benutzer bei einem cin-Befehl nichts eingegeben und einfach die Eingabetaste gedrückt hat?

  • Lies eine Zeile und zähle wie viele Zeichen?

    – Anonym.

    15. Februar 2011 um 3:36 Uhr

Benutzer-Avatar
Vorlagentypdef

Beim Lesen aus std::cinist es vorzuziehen, die nicht zu verwenden Stream-Extraktionsoperator >> da dies alle möglichen unangenehmen Nebenwirkungen haben kann. Wenn Sie beispielsweise diesen Code haben:

std::string name;
std::cin >> name;

Und ich trete ein John Doedann die Zeile, aus der gelesen werden soll cin wird nur den Wert halten JohnVerlassen Doe dahinter, um von einer zukünftigen Leseoperation gelesen zu werden. Ebenso, wenn ich schreiben würde:

int myInteger;
std::cin >> myInteger;

Und ich tippe dann ein John Doedann cin wechselt in einen Fehlerzustand und verweigert zukünftige Lesevorgänge, bis Sie den Fehlerzustand explizit löschen und die Zeichen löschen, die den Fehler verursacht haben.

Eine bessere Möglichkeit für Benutzereingaben ist die Verwendung std::getline um Zeichen von der Tastatur zu lesen, bis der Benutzer die Eingabetaste drückt. Zum Beispiel:

std::string name;
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL.

ADL steht für Argument-Dependent Lookup. Wenn ich jetzt eintrete John Doeder Wert von name wird sein John Doe und es werden keine Daten mehr da sein cin. Darüber hinaus können Sie damit auch testen, ob der Benutzer gerade die Eingabetaste gedrückt hat:

std::string name;
getline(std::cin, name);

if (name.empty()) {
    /* ... nothing entered ... */
}

Der Nachteil bei der Verwendung dieses Ansatzes besteht darin, dass, wenn Sie eine formatierte Datenzeile einlesen möchten, an int oder ein double Sie müssen die Darstellung aus der Zeichenfolge analysieren. Ich persönlich denke, das ist es wert, weil es Ihnen eine genauere Kontrolle darüber gibt, was zu tun ist, wenn der Benutzer etwas Ungültiges eingibt und “wächst”. cin davor, jemals in einen Fail-Zustand zu geraten.

Ich unterrichte einen C++-Programmierkurs und habe einige Vorlesungsunterlagen über die Streams-Bibliothek das geht ziemlich ins Detail darüber, wie man formatierte Daten liest cin auf sichere Weise (meistens am Ende des Kapitels). Ich bin mir nicht sicher, wie nützlich Sie das finden werden, aber falls es hilfreich ist, dachte ich, ich würde den Link posten.

Hoffe das hilft!

  • Vielen Dank für diese Antwort, sie hat mir wirklich bei einem Programm geholfen, an dem ich arbeite. Ich schreibe diesen Kommentar, weil ich etwas Interessantes gefunden habe. Ich habe eine if-else-Anweisung, die überprüft, ob der Benutzer “y”, “n”, etwas anderes oder gar nichts eingibt. Ich habe festgestellt, dass das Programm den Fall “überhaupt nichts” nicht trifft, es sei denn, ich beginne das if-else mit diesem Fall. Ich bin mir nicht sicher, ob das auch anderen Leuten passiert ist.

    – Jesse Smothermon

    22. März 2011 um 21:47 Uhr

cin fährt mit dem Programm nicht fort, es sei denn, der Benutzer gibt mindestens 1 Zeichen ein (Eingabe zählt nicht). Wenn der Benutzer KEINE Eingabe macht, wartet cin einfach weiter darauf, dass der Benutzer eine Eingabe macht, und drückt dann die Eingabetaste.

  • Fast wahr; hängt davon ab, welche Operation Sie mit Cin machen.

    – Fred Nurk

    15. Februar 2011 um 3:53 Uhr

  • @Fred-Nurk – Kannst du mir ein Beispiel geben?

    – Mazzaboy

    15. Februar 2011 um 4:41 Uhr

  • Getline wurde in einer anderen Antwort erwähnt, aber cin.get und cin.ignore sind andere.

    – Fred Nurk

    15. Februar 2011 um 6:59 Uhr

Benutzer-Avatar
Kartikya

Der einfache Weg >>

{
char X=0; //  ASCII( 0 ) means a NULL value
cin>>X;
if(X==0 || X==10) // ASCII( 10 ) means ENTER
cout<<"User din't enter ANYTHING !! ";
}

Aber ein einfaches Problem ist ….

cin erlaubt es Ihnen einfach nicht, sich weiter zu bewegen, ohne ein Zeichen einzugeben

Mit Zeichen meine ich hier eine ZIFFER oder ein Alphabet oder ein Sonderzeichen, kein Leerzeichen, geben Sie null ein usw

Ich hoffe, das löst Ihr Problem, wenn nicht, helfe ich Ihnen gerne, lassen Sie es mich einfach wissen.

int main(){ 
string str[100];
std::cout<<"Hello how are you ? \n";
std::cin>>str;
if(str.length() > 0){
// If input is seen
}
else{
// If input is not seen
}
}

Bei Problemen lassen Sie es mich wissen.

1012200cookie-checkC++: Wie überprüfe ich, ob der Cin-Puffer leer ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy