# Prüfen, ob Eingabe Int ist



## Snowowl (13. Oktober 2006)

Hallo liebes forum!

Ich bin C++ Anfänger und möchte gerne prüfen, ob eine Eingabe über cin >> var eine Zahl, bzw. int ist. WIe kann ich das realisieren?

Danke für eure Hilfe,

Niklas


----------



## GeHo (13. Oktober 2006)

Nachdem du cin zum Einlesen verwendet hast, kannst du mit cin.fail() feststellen, ob die Eingabe erfolgreich war. Liefert cin.fail() true zurück ist das Einlesen fehlgeschlagen, bei false ist wurde richtig eingelesen. Also zum Beispiel: 

```
#include <iostream>
using namespace std;

int main () {
    int a;
    
    cin >> a; 
    if ( cin.fail() ) 
       cout << "Einlesen fehlgeschlagen!" << endl;  
    else
        cout << a << endl;
        
    system("PAUSE");
    return 0;
}//main
```


----------



## Snowowl (13. Oktober 2006)

Hi,

danke erstmal für deine Antwort!
Jedoch ist dies nciht genau, was ich suche.
Ich möchte ja nucht nur prüfen, ob eine Eingabe geschehen ist,
sondern auch, ob dies eine zahl ist. Wenn nicht, dann will ich
nämlich mit goto wieder woanders hin. 

Grüße,

Niklas


----------



## _prodigy (13. Oktober 2006)

Genau das überprüft dieser Code... 

Vielleicht probierst du es mal aus bevor du sagst das es nicht klappt?


----------



## Ives (14. Oktober 2006)

Es macht wahrscheinlich keinen Sinn dir zu sagen das GOTO im Normalfall ein absolutes Tabu ist, aber ich sags dir trotzdem


----------



## Snowowl (14. Oktober 2006)

Hi,

warum ist GOTO, denn ein absolutes Tabu?
Gibt es dafür eine "Alternative"?

Grüße,

Niklas


----------



## Ives (15. Oktober 2006)

Ja im Normalfall lässt sich ein absoluter Sprung durch strukturiertes Programmieren verhindern. Zum Beispiel mit Hilfe von Schleifen, IF-Abfragen, Funktionen etc.


----------



## xFile (15. Oktober 2006)

hey,
erstmal zu deinem problem mit der int überprüfung.
es gibt konvertierungs- und klassifizieruntgsroutinen mit den du eine variable überprüfen kannst.


#include <ctype.h>
#include <iostream>
unsing namespace std;
...
int izahl = 0;

if (isdigit(izahl)) {
   cout<<"izahl ist eine zahl");
}
else {
   cout<<"fehler";
}
...

vielleicht löst du dein problem bei goto durch escapesequenzen ?
könntest dir ja funktionen schreiben wie z.b. setcoord(x, y)


mfg adam


----------



## singh (17. November 2008)

Hi,
ich hab das gleiche Problem und habe micht für die Lösung von xFile entschieden jedoch gibts da noch ein Problem...
Ich hab frage vom Benutzer eine Zahl ab, falls er aber was anderes als eine Zahl eingibt dann soll er wieder und wieder gefragt werden bis er es richtig macht. Nunja dann habe ich folgendes geschrieben:


```
while(isdigit(iZahl1))
           {
            cout<<"Sie haben eine ungueltige Zahl eingegeben! Versuchen Sie es erneut.\n";
            cout<<"Eingabe: ";
            cin>>iZahl1;
           }
```

Jetzt ist das aber irgendwie eine endlosschleife und er gibt die ganze zeit "Sie haben eine..." aus und zur erneuten Eingabe komme ich gar nicht mehr. Wisst ihr vllt wo der fehler ist?

Gruß


----------



## deepthroat (17. November 2008)

singh hat gesagt.:


> Hi,
> ich hab das gleiche Problem und habe micht für die Lösung von xFile entschieden


Die Lösung von xFile ist nicht gerade günstig.

Die Funktion isdigit überprüft wie der Name schon sagt ein einzelnes Zeichen darauf ob es eine Ziffer ist. Du möchtest allerdings prüfen, ob der Benutzer eine Zahl eingegeben hat.

Dein Problem entsteht dann letztlich dadurch das der Eingabestream cin in einem Fehlerzustand ist. Und von einem Stream im Fehlerzustand kann nichts mehr eingelesen werden. Du mußt den Zustand des Stream wieder zurücksetzen um wieder etwas einlesen zu können.


```
int zahl;

do {
  cout << "Eingabe: ";
  if (cin >> zahl) {
    // hat geklappt => raus aus der schleife
    break;
  } else if (!cin.bad() && !cin.eof()) {
    cerr << "Sie haben eine ungueltige Zahl eingegeben! Versuchen Sie es erneut.\n";
    cin.clear(); // Fehlerzustand zurücksetzen
  }
} while (cin);
```
Gruß


----------



## singh (17. November 2008)

Hi,
danke hab das jetzt gleich mal ausprobiert doch irgendwie springt er in eine Endlosschleife wenn ich Buchstaben statt zahlen eingebe... Dann gibt er mir x mal die Fehlermeldung aus jedoch komme ich nichtmehr zur eingabe... was nun?


----------



## deepthroat (17. November 2008)

singh hat gesagt.:


> Hi,
> danke hab das jetzt gleich mal ausprobiert doch irgendwie springt er in eine Endlosschleife wenn ich Buchstaben statt zahlen eingebe... Dann gibt er mir x mal die Fehlermeldung aus jedoch komme ich nichtmehr zur eingabe... was nun?


Du hast natürlich Recht. Die Eingabe steht ja immer noch im Eingabepuffer und muß erst noch entfernt werden:

```
#include <limits>

...
} else if (!cin.bad() && !cin.eof()) {
    cerr << "Sie haben eine ungueltige Zahl eingegeben! Versuchen Sie es erneut.\n";
    cin.clear(); // Fehlerzustand zurücksetzen

    // fehlerhafte Eingabe entfernen
    cin.ignore(std::numeric_limits<streamsize>::max(),'\n');    
}
```
Sorry, hatte ich vergessen 

Gruß


----------



## singh (17. November 2008)

jahuuu es funktioniert =) danke


----------

