Probleme bei Eingabe von Buchstaben anstatt Zahlen

Hatemachine

Cadet 4th Year
Registriert
Juli 2003
Beiträge
78
Ich sitze gerade hier auf der Arbeit und programmiere ein Tool zum Errechnen von zurückgelegter Strecke und Winkel eines Pfeils anhand eines Koordinatensystems.......

Allerdings habe ich noch ein kleines Problem.
Bei der Eingabe der max. Anzahl von Rastern werden Integerwerte erwartet. Gibt der Benutzer nun einen Buchstaben ein, verabschiedet sich das Programm.

Sobald ein Buchstabe eingegeben wurde, verhält sich das Programm, als ob man ständig die Eingabetaste betätigen würde...

Nun meine Frage. Wie kann ich nach der Eingabe auf Buchstaben prüfen und zur erneuten Eingabe auffordern?
Stehe im Moment total auf dem Schlauch.

Also do-while-Schleife is schon klar, nur worauf soll ich in der Bedingung prüfen?

Zur besseren Vorstellung hier ein paar Codeschnipsel:

Schnipp:
Code:
  cout<<"Maximale Anzahl an Rastern festlegen...\n\n"; 
  cin>>anz_r; 
  k1.raster(anz_r);

Schnapp:
Code:
void CKoordinaten::raster(int anz_r) 
{ 
 maxraster = anz_r; 
}
 
Du könntest es mal mit einem try-catch Block versuchen. Leider kenn ich grad nicht Exception dazu.
 
Code:
  cout<<"Maximale Anzahl an Rastern festlegen...\n\n"; 
  while( !(cin>>anz_r)) {
     cout << "Fehlerhafte Eingabe. Bitte noch einmal. \n";
     cin.clear();
  } 
  k1.raster(anz_r);

So sollte es funktionieren. Wenn beim Einlesen von anz_r ein Fehler auftritt - also Daten kommen, die nicht zur erwarteten Eingabe passen - dann wird von cin das failbit gesetzt. Mit !(cin >> anz_r) wird das failbit überprüft, nachdem die Eingabe erfolgt ist.
Wichtig ist es, nach einem fehlgeschlagenen Einleseversuch das failbit mit clear zurückzusetzen. Ansonsten verhalten sich fast alle Operationen auf dem Stream wie ein No-Op - sprich sie machen einfach garnichts (was wiederum das Verhalten sein wird, dass Du beobachtet hast).


@daemon777: Das bringt nur etwas, wenn man mit cin.exceptions ( ...) auch eingestellt hat, dass Exceptions geworfen werden im Fehlerfall. Vor dem zurücksetzen des Streams mit clear schützt das aber auch noch nicht.
 
Zuletzt bearbeitet:
@ 7H3 N4C3R

Hab' Deinen Code mal in das Programm eingefügt, allerdings gerät es nach der Eingabe von beispielsweise "a" wieder in eine Endlosschleife. :(
Verhält sich also im Prinzip genau wie mein Programm...
 
Was wird denn in der Schleife ausgegeben? Nur "Fehlerhafen Ausgabe versuche es nochmal" Oder kannst du auch eine neue Eingabe machen ?
 
Hmm möglicherweise bleibt das a noch im Stream und wird nicht entfernt -was beim erneuten Lesen natürlich wieder zu einem Fehler führen würde. Füg mal das cin.get() ein.

Code:
  cout<<"Maximale Anzahl an Rastern festlegen...\n\n"; 
  while( !(cin>>anz_r)) {
     if( cin.eof() ) {
        cout << "Oops, Stream zuende :-)" << endl;
        break;
     }
     cout << "Fehlerhafte Eingabe. Bitte noch einmal. \n";
     cin.clear();
     cin.get();
  } 
  k1.raster(anz_r);

Falls das nix hilft, muss ich mir gleich mal mein Buch greifen und das nachlesen...

Btw - welche Entwicklungsumgebung (+Version) hast Du? Manche älteren Implementationen haben einige Bugs in den IOStreams.
 
Zuletzt bearbeitet:
Hey wenn ich das richtig verstanden habe geht’s um die Deklaration der Variablen
Code:
int jahr;
printf("\t\t\tWelches Jahr haben wir?\n");
cin>>jahr;
printf("\nWir haben das Jahr: %i\n",jahr);
 
Nein hast du nicht es geht darum dass er einen Fehler bekommt da im Fehlerfall ein char Wert in eine integer Variable geschrieben wird.
 
Zurück
Oben