Eingangspuffer löschen in C++
Dieser Artikel zeigt verschiedene Methoden zum Löschen des Eingabepuffers in C++.
Verwendung von die Funktion std::cin::ignore
zum den Eingabepuffer in C++ zu löschen
ignore
ist eine integrierte Funktion des Objekts std::cin
und kann verwendet werden, um Zeichen aus dem Eingabestream bis zum angegebenen Trennzeichen zu extrahieren und zu verwerfen. Bevor wir das Verhalten der Funktion cin::ignore
diskutieren, sollte beachtet werden, dass Standardeingabe- und -ausgabestreams wie cin
/ cout
gepuffert werden, was bedeutet, dass zwischen den Schreib- / Lesevorgängen des Benutzers eine gewisse Buchhaltung stattfindet und den tatsächlichen Pufferstatus im Betriebssystemkern. Dieser Puffer wird von der C++-Bibliothek selbst verwaltet und dient dazu, Lese- / Schreibanforderungen effizienter zu gestalten. Beachten Sie, dass das Aufrufen von Betriebssystemdiensten für jedes Byte eine recht ineffiziente Verwendung der CPU-Ressourcen darstellt. Daher wird der Zwischenpuffer verwendet, um einige Anforderungen zu akkumulieren und dann das Betriebssystem mit einer einzelnen Anforderung aufzurufen.
Somit kann cin::ignore
übrig gebliebene Bytes im Puffer verwerfen, die bei aufeinanderfolgenden Aufrufen möglicherweise versehentlich gelesen werden. Der folgende Beispielcode soll das Verhalten ignore
deutlicher veranschaulichen. Wir haben eine Endlosschleife while
implementiert, die drei Ganzzahlen aus dem Stream cin
liest und in den entsprechenden Variablen speichert. Die ganzen Zahlen werden in das cout
gedruckt und dann wird die Routine bei der nächsten Iteration ausgeführt. Beachten Sie, dass der Benutzer bei der ersten Iteration möglicherweise mehr als drei Ganzzahlen bereitstellt. In diesem Fall würde der Code vor cin.ignore
nur 3 davon speichern, und andere sind noch in einem Zwischenpuffer vorhanden. Wenn nun cin.ignore
nicht mit den angegebenen Parametern aufgerufen wird, liest die nächste Iterationszeile cin >>
den Rest der Eingabe und das inkonsistente Verhalten tritt auf. Der Aufruf cin.ignore
kann in solchen Szenarien verwendet werden, um die Eingabe zu verwerfen, bis das angegebene Zeichen nicht mehr gefunden wird. In diesem Fall haben wir ein neues Zeilenzeichen angegeben, das im Allgemeinen zum Puffern des cin
-Streams verwendet wird.
#include <iostream>
#include <limits>
#include <sstream>
using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;
int main() {
while (true) {
int i1, i2, i3;
cout << "Type space separated numbers: " << endl;
cin >> i1 >> i2 >> i3;
if (i1 == 0) exit(EXIT_SUCCESS);
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
cout << i1 << "; " << i2 << "; " << i3 << endl;
}
return EXIT_SUCCESS;
}
Ausgabe (mit der Beispielbenutzereingabe):
Type space separated numbers:
12 32 54
12; 32; 54
Alternativ können wir einen anderen Beispielcode implementieren, der zwei Zeichenketten verwendet, die durch ein Leerzeichen getrennt sind. In diesem Szenario besteht die Möglichkeit, dass der Benutzer mehr als zwei Namen angibt, wodurch dieser Code gezwungen wird, alle Initialen nach zwei durch Leerzeichen getrennten Zeichenketten zu löschen. Wenn die Benutzereingabe nur einen Namen und ein Leerzeichen enthält, wird als zweite Initiale ein Zeilenumbruchzeichen gespeichert, das die Eingabe cin
immer beendet. Das letztere Verhalten kann demonstriert werden, indem die Einzelzeichenausgabe nach der Anweisung << name << surname
hinzugefügt wird.
#include <iostream>
#include <limits>
#include <sstream>
using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;
int main() {
char name, surname;
cout << "Type your name and surname: ";
name = cin.get();
cin.ignore(numeric_limits<std::streamsize>::max(), ' ');
surname = cin.get();
cout << "Your initials are: " << name << surname << endl;
return EXIT_SUCCESS;
}
Ausgabe (mit der Beispielbenutzereingabe):
Type your name and surname: Lama Lime
Your initials are: LL
``
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook