Eine Frage zu beiden Codeschnippseln.
Was willst du damit genau erreichen?
cin.fail() prueft nur ob ueberhaupt ein Zeichen eingegeben wurde, was zum Variablentyp passt. Dein Problem ist, dass du den Puffer nicht loescht und somit auch nachfolgend noch cin.fail den alten Zustand hat.
Nachfolgend mehrere Vorschlaege:
1. Eingabepruefungen werden im Allgemeinen mit Dauerschleifen implementiert.
Dauerschleife ist bsp. folgendes
Code:
while (1){
if (...){
} else
break;
}
in diesem Fall laeuft die Schleife genau solange wie der If-Fall vorliegt, notfalls bis ins Unendliche. sobald der Else-Fall eintritt wird die Schleife mit break verlassen.
2. Eine Eingabe auf korrekte Zeicheneingabe pruefen macht man normal, indem man auf den entsprechenden Ascii- oder Unicode des geforderten Zeichens ueberprueft.
Wichtig dabei ist, wenn die Eingabe falsch ist unbedingt den Eingabepuffer mit cin.clear() und darauffolgend einer cin.ignore() Kette loeschen, da sonst der Muell von der Vorherigen Eingabe noch drin steht (C/C++ hat keinen automatischen Muellentleerer eingebaut).
eine moegliche Sequenz waere besp:
Code:
cin.clean();
while (cin.tellg() > 0) cin.ignore;
cin.clear() setzt cin wieder in den Ausgangszustand, was den Fehlerspeicher fuer fail() etc loescht.
die Whileschleife prueft ob der Inhalt des gerade angeschauten Cin-Elements im Puffer gleich oder ungleich 0 ist. Ist es ungleich rutscht er eine Adresse hoeher etc pp, bis er an einen leeren Platz kommt. Ende vom Lied ist, dass du keinen alten Datenschrott mehr drin hast. Sowas ist immer nervig, wenn du ein Feld mit 30 Zeichen hast, aber nur 5 eingelesen werden. die restlichen 25 sind dann mit irgendwelchem Muell aber mit Nichten mit 0en gefuellt. Das kann zu erstaunlichen Ergebnissen fuehren.
3. Die Pruefung auf Zeichen. das macht eine If-Abfrage, die Prueft ob das Zeichen, oder bei einem String jedes eingegebene Zeichen den Anforderungen des Programmierers entspricht.
komplett koennte dass dann wie folgt aussehen: (aufgebaut fuer ne Zeichenkette, getline liesst ne Zeichenkette ein) (bsp fragt ab, ob Ziffern eingegeben wurden)
Code:
...
while (1) {
cin.clean();
while (cin.tellg() > 0) cin.ignore(); //alternativ fuer diese Zeile einfach cin.sync();
cin.getline(var, 10); //Liesst die ersten 10 Zeichen der Tastatureingabe ein.
for (int i=0; i<10; i++) { //laeuft die einzelnen Elemente der Eingabe durch.
if (var[i] >= '0' && var[i] <= '9') { //Prueft ob Eingabe in Ascii-Tabelle zwischen 0 und 9 liegt, also Prueft auf Zahl
cout << "korrekte Eingabe" << endl;
break;
}
cout << "Eingabe falsch, bitte nocheinmal" << endl;
}
}
*Irgendwie war ichjetzt wohl fuer die C++-Code-Darstellung zu bloed, aber was solls ...
![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)