2 Fragen zur Fehlerbehandlung



  • Ok ich weiß die Fragen sind wohl etwas blöd, aber trotzdem...

    1.) Ich will eine Zahl einlesen, z.B. so

    int i;
    cin >> i;
    

    Wie kann ich es verhindern bzw erkennen, wenn der User statt einer Zahl z.B. Buchstaben eingibt ?

    2.) Ich habe einen Array und will mithilfe von getline einen String einlesen

    char buf[32];
    cin.getline(buf, 32);
    

    Man kann aber durchaus mehr als 32 Zeichen eingeben. Wie kann ich das verhindern ?

    Danke im voraus...



  • da wir ja im C++ Forum sind, kannst du anstatt char* auch cin >> std::string nehemn. Ich glaub, das geht auch.

    Zur ersten FRage:
    Lies doch den Wert erst in einen String ein, und teste dann mit einer Funktion, ob die Zeichenkette eine Zahl ist udn wandele sie dann mit atoi oder so um



  • Zire schrieb:

    Ok ich weiß die Fragen sind wohl etwas blöd, aber trotzdem...

    1.) Ich will eine Zahl einlesen, z.B. so

    int i;
    cin >> i;
    

    Wie kann ich es verhindern bzw erkennen, wenn der User statt einer Zahl z.B. Buchstaben eingibt ?

    if(cin >> i)
        // es hat geklappt
    else
        // es hat nicht geklappt, weiter Fehlerbehandlungen können erfolgen
    

    Außerdem plenkst du.

    Zire schrieb:

    2.) Ich habe einen Array und will mithilfe von getline einen String einlesen

    char buf[32];
    cin.getline(buf, 32);
    

    Man kann aber durchaus mehr als 32 Zeichen eingeben. Wie kann ich das verhindern ?

    Danke im voraus...

    Es werden aber nicht mehr als die von dir angegebenen zeichen eingelesen. Geschickt wäre es außerdem

    cin.getline(buf, sizeof buf / sizof buf[0]);
    

    zu schreiben. Zumindest bei statischen Puffern, da man nun Fehlersuche durch ändern der Feldgröße vorgebeugt hat.

    Gruß Tobias



  • Das mag ja sein, dass getline tatsächlich nicht mehr Zeichen als angegeben einliest, aber wenn ich dann z.B. nach getline, nochmal etwas ausgebe, und anschließend wieder etwas einlese, wird das halt einfach "übersprungen". Wie beuge ich dem vor ?



  • cin.sync();
    

    schmeisst ungelesene zeichen aus dem stream



  • Zire schrieb:

    Das mag ja sein, dass getline tatsächlich nicht mehr Zeichen als angegeben einliest, aber wenn ich dann z.B. nach getline, nochmal etwas ausgebe, und anschließend wieder etwas einlese, wird das halt einfach "übersprungen". Wie beuge ich dem vor ?

    Oder man nutzt tatsächlich einen std::string und braucht sich keine Sorgen zu machen. Der overhead dürfte auch minimal sein.



  • Danke, aber das funktioniert immer noch nicht. Angenommen ich habe folgendes:

    char buf[5];
    int i;
    
    cout << "Eingabe: ";
    cin.getline(buf,5);
    cin.sync(); //bringt nichts
    cout << "Zahl eingeben: ";
    cin >> i;
    
    cout << "\n" << buf << "\n" << i;
    

    Dann wird die folgende Eingabeoperation übersprungen, wenn ich bei getline zu viele Zeichen eingebe...



  • Du kannst auch cin.ignore nutzen oder einen std::string!



  • cin.ignore() funktioniert ebenfalls nicht.
    Ich hätte aber gerne gewusst wie man das so macht...


Anmelden zum Antworten