cin>>int //was tun bei einem Buchstaben?



  • Hi.
    Folgendes Problem:
    Ich habe ein Programm, da muss der Benutzer dann eine Zahl eingeben.
    Wenn er aber einen Buchstaben eingibt, stürzt das ganze Programm ab!
    Das möchte ich natürlich nicht.Ich möchte also, dass wenn er einen Buchstaben eingibt, soll er noch eine "chance" bekommen eine Zahl einzugeben.
    Durch googeln hab ich dann rausgefunden, wie man prüfen kann, ob es eine Zahl ist.
    unszwar folgendermaßen:

    while (1==1)   //<-- mir ist grad nichts besseres eingefallen :P
        {
            einsatz = 0;
            if( cin >> einsatz)  //<-- hier, prüfen obs eine Zahl ist.
            {    
                refresh();
                cout<<endl;
                break;
            }
            else
            {
                cout<<"Bitte nur Zahlen eingeben."<<endl;
            }
        }
    

    (Die Variable Einsatz ist übrigens deklariert mit "int")
    So... jetz aber immernoch ein Problem.Wenn man einen Buchstaben eingibt, schreibt der in einer endlosschleife immer wider : Bitte nur Zahlen eingeben.
    Also, der Benutzer kann nicht noch einmal etwas eingeben.
    Durch weiteres googeln habe ich dann noch etwas über "buffer leeren" gehört...
    hab ich dann auch versucht:

    while (1==1)   //<-- mir ist grad nichts besseres eingefallen :P
        {
            einsatz = 0;
            if( cin >> einsatz)
            {    
                refresh();
                cout<<endl;
                break;
            }
            else
            {
                cin.clear();                           // Buffer leeren?
                cin.ignore(cin.rdbuf()->in_avail());   // Buffer leeren?
                cout<<"Bitte nur Zahlen eingeben."<<endl;
            }
        }
    

    Aber es klappt immernoch nicht.Hab' durch googeln und Forumsuche nichts weiteres gefunden was mir helfen könnte.
    Ich hoffe ihr könnt mir helfen 😃 (Falls es wen interessiert, es soll später ein Spiel (blackjack) werden.)
    mfg



  • also wenn du windows benutzt kannst du z.b.

    die erfolgreiche eingabe überprüfen , wenn sie falsch ist dann soll eine schleife um noch eine eingabe bitten, damit du keine endlosschleife bekommst musst du den buffer(puffer oder egal wie 😃 ) leeren z.b. mit flush(stdin) oder mit while(getchar!='\n')
    oder cin.flush



  • Stelfer schrieb:

    also wenn du windows benutzt kannst du z.b.

    die erfolgreiche eingabe überprüfen , wenn sie falsch ist dann soll eine schleife um noch eine eingabe bitten, damit du keine endlosschleife bekommst musst du den buffer(puffer oder egal wie 😃 ) leeren z.b. mit flush(stdin) oder mit while(getchar!='\n')
    oder cin.flush

    Verstehe ich nicht ganz...Ja, ich benutze Windows.Das Programm sollte aber wenn möglich auch ohne Windows laufen 😉 (Linux+Windows sollt eig. reichen).
    Aber wenn ich sonst keine möglichkeit finde, ist's auch nicht schlimm, wenn es nur unter Windows geht.Aber trotzdem komm ich nicht viel weiter.
    Muss ich da "windows.h" includieren?Bei den Befehlen:
    cin.flush
    flush(stdin)
    Bekomme ich einen Fehler.
    cin.flus :'struct std::istream' has no member named 'flush'
    flush(stdin) : no matching function for call to flush(FILE*)' hab windows.h übrigens includiert. und: while(getchar != "\\n") heißt doch, sobald ich nichts eingebe,geht die Schleife zuende?Gilt bei "falschen" eingaben wie "abcdefghijklmnopqrstu..." auch wie eine leere eingabe?Ach.. dumme Frage eig. ich probiere es einfach aus.^^ Mit while(getchar != "\\n") bekomme ich auch eine Fehlermeldung.. comparison between distinct pointer types \int ()()' and ` const char' lacks a cast



  • Stelfer schrieb:

    flush(stdin)

    Lieber nicht: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html

    oder mit while(getchar!='\n')

    Jap, aber:

    void ignore() {
      int c;
      while ( (c = getchar()) != '\n' && c != EOF );
    }
    


  • Danke euch, funktioniert wunderbar 👍



  • hab jetzt auch genauso ein Problem wie du Sabjosu..Ich will prüfen, ob eine Zahl oder ein Buchstabe eingegeben wurde...
    aber i komm nicht weiter!
    Wie hast du es letztendlich gemacht? kannst du deinen Code vll mal posten?

    Meiner sieht so aus...

    cout <<endl<<"Bitte geben Sie die Kraft F ein [in N]:";
      while(1)
      { if(cin >> f) {break;}
        else
            { cout<<"Bitte nur Zahlen eingeben."<<endl;
              cin.clear();                           
            }
       }
    

    aber leider läuft der Text " Bitte nur Zahlen eingeben" in einer Endlosschleife..was muss ich einfügen und wo, damit das problem behoben ist ?
    Danke im voraus!



  • Du musst den Eingabepuffer noch leeren, das geht so:

    cin.ignore( numeric_limits< streamsize >::max(), '\n' );
    


  • -.-
    wurde doch bei den lösungsvorschlägen



  • while (1==1) //<-- mir ist grad nichts besseres eingefallen 😛
    {
    einsatz = 0;
    if( cin >> einsatz)
    {
    refresh();
    cout<<endl;
    break;
    }
    else
    {
    cin.clear(); // Buffer leeren?
    cin.ignore(cin.rdbuf()->in_avail()); // Buffer leeren?
    cout<<"Bitte nur Zahlen eingeben."<<endl;
    }

    fflush(stdin);

    getchar();

    }



  • Tro1aner schrieb:

    while (1==1) //<-- mir ist grad nichts besseres eingefallen 😛
    {
    einsatz = 0;
    if( cin >> einsatz)
    {
    refresh();
    cout<<endl;
    break;
    }
    else
    {
    cin.clear(); // Buffer leeren?
    cin.ignore(cin.rdbuf()->in_avail()); // Buffer leeren?
    cout<<"Bitte nur Zahlen eingeben."<<endl;
    }

    fflush(stdin);

    getchar();

    }

    Der Schleifenkopf ist sinnlos, da kannst du gleich while(1) schreiben, zum anderen kannst du den rückgabewert von cin abfangen und mit dem arbeiten,

    dein fflush(stdin) ist kein standard und macht dir probleme beim porten auf andere rechner, der befehl wird nur akzeptiert bei windows os, dein flush kann man sich auch ersparen weil du den buffer weiter oben leerst.

    mfg
    stelfer



  • while (1==1) //<-- mir ist grad nichts besseres eingefallen :P
    

    lol. Naja, ist ja auch nicht so wichtig ...



  • Ich wollte noch anmerken, dass man sich das ganze auch einfacher machen kann. Man liest mit getline(cin,string blup) einfach einen String ein und checkt dann anstatt mit if(blup==1) mit if(blup=="1") und schon hat man das Problem mit den Buchstaben anstatt int Werten umgangen und brauch sich nicht die Mühe machen mit dem Buffer leeren.



  • Für einen Vergleich mit ein paar festen Werten mag das ja noch gehen (obwohl selbst da der int-Vergleich schneller sein wird als ein string-Vergleich), aber wenn du mit der Eingabe rechnen willst, verschiebst du dir die Unterscheidung nur auf später (bei der Umwandlung der Eingabe in einen int-Wert).


Anmelden zum Antworten