wie vermeide ich programmabstürze wenn falsche variablentypen aufgerufen werden.



  • hallo forum,

    ich bin neu beim cpp programmieren und habe jetzt ein Problem was ich nicht umgehen kann.

    wie kann ich programmabstürze vermeiden wenn mir bei dem einlesen von einer variable ein typen fehler unterläuft.
    bsp

    int x;
    cin >> x;
    

    wenn für x jetzt 'e', 'hallo' oder '34er' eingegeben wird ist der variablen aufruf fehlerhaft.
    wie kann ich das umgehen/ abfangen. Sprich es soll bei fehlerhafter eingabe erneut nachgefragt werden.

    danke für die hilfe, ich guck in der zwischenzeit durch die FAQ



  • Hi,

    cin wird im Fehlerfall "ungültig", was man direkt mit if(!cin) abfragen kann:

    int x;
    cin >> x;
    if(!cin) {
       cout << "Fehler\n";
       return 8;
    }
    ...
    

    Gruß,

    Simon2.



  • @ Simon, aber nicht vergessen das Fail-Bit(ist es das?) wieder zurückzusetzen, sonst klappt danach keine weitere Eingabe.So sind meine Erfahrungen.



  • jo ich merk schon das die weitere eingabe nicht funktioniert. wie ist das mit dem Fail-Bit gemeint?
    in meinem Fall will ich ja eine vernüftige eingabe bekommen



  • int x
    while(!cin>>x)
    {
      std::cout<<"Falsche Eingabe"<<std::endl;
      std::cin.ignore();
      std::cin.clear();
     }
    

    das sollte in etwa laufen, habs gerade nicht getestet



  • In etwa so:

    //...
    int x;
    while(true)
    {
      cout << "Gib ein den Kram: " << endl;
      cin >> x;
      if (cin.good()) break;
      else cin.clear();
    }
    


  • Firefighter schrieb:

    @ Simon, aber nicht vergessen das Fail-Bit(ist es das?) wieder zurückzusetzen, sonst klappt danach keine weitere Eingabe.So sind meine Erfahrungen.

    Ich habe es nicht vergessen, sondern wollte das Beispiel extra schlicht und "fragebeantwortend" machen. Deswegen lasse ich ja auch das Programm enden, sobald ein Fehler bei der Eingabe auftaucht.... 😃

    Aber du hast schon recht: Ein Satz wie "Wenn Du bei einem Fehler nicht das Program beenden sondern weitermachen willst, musst Du cin.clear() aufrufen" wäre noch wichtig gewesen.
    Danke für die Ergänzung. 👍

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Aber du hast schon recht: Ein Satz wie "Wenn Du bei einem Fehler nicht das Program beenden sondern weitermachen willst, musst Du cin.clear() aufrufen" wäre noch wichtig gewesen.

    Konnte ich mir fast denken das du es extra so gemacht hast, aber hast Recht, der zusätzliche Satz hätte die Sache komplett abgerundet 🙂


Anmelden zum Antworten