Problem mit cin.get in do-while Schleife



  • Wenn ich in einer do-while Schleife eine Abfrage mit cin.get einbaue und statt einer Eingabe nur die Eingabetaste drücke, hängt das Programm in einer Endlosschleife fest und wartet nicht mehr auf eine neue Eingabe:

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main (int argc, int *argv[])
    {
       char string[11];
       int number = 0;
    
      do
      {
         cin.sync ();
    
         cout << "Eingabe: ";
         cin.get (string, 10);
    
         cin.sync ();
      } while (number == 0);
    
       return EXIT_SUCCESS;
    }
    


  • Weil dein Stream kaputt ist.

    if(!cin)
        cin.clear();
    

    vor die Eingabe.

    MfG SideWinder



  • Danke für die schnelle Hilfe, aber das Problem besteht weiterhin, obwohl ich dein Code-Schnipsel vor die Abfrage eingefügt habe.



  • cin.get lässte das "Enter" im Strean stehen, daher kommt der Fehler.
    Mach aus dem get ein getline, dann besteht der Fehler nicht mehr.

    Wenn du doch get benutzen möchtest baue noch ein

    cin.ignore(cin.rdbuf()->in_avail());
    

    eine damit der Zeilenumbruch ignoriert/übergangen wird.



  • @Freak_Coder: Dein Vorschlag hat leider auch nicht geholfen. Ich habe aber, glaube ich, dass Problem gefunden (s.u.).

    Ich habe einen Freund nach einem Tipp gefragt und er schlug mir fflush (stdin) vor. Funktionierte leider auch nicht, bis ich in der MSDN unter fflush nachgesehen habe und sah, dass es dort nicht mit cin.get () sondern mit gets () verwendet wird. Aber warum funktioniert es mit gets () und mit cin.get () nicht?

    MfG
    HalliDalli



  • char string[11];
    int number = 0;
    
    do
    {
    	std::cout << "Eingabe: ";
    	std::cin.get (string, 10);
    	std::cin.clear();
    	std::cin.ignore( std::cin.rdbuf()->in_avail() );
    } while (number == 0);
    

    geht!

    Oder aber mit std::string:

    std::string text;
    int number = 0;
    
    do
    {
    	std::cout << "Eingabe: ";
    	std::getline( std::cin, text );
    	std::cin.clear();
    	std::cin.ignore( std::cin.rdbuf()->in_avail() );
    } while ( (number == 0) && ( text != "exit" ) );
    

    grüße



  • Nabend,

    std::cin.rdbuf()->in_avail()
    

    in_avail() liefert in einigen Implementierungen allerdings nur 0. Irgendwo hat
    Humesikkins einmal einen Post darueber geschrieben. Im selben Thread gabs auch
    ein Workarround fuer das Problem.

    D. h. konkret, dass der Code nicht zwingend ueberall lauffaehig ist.

    gruss
    v R



  • HalliDalli schrieb:

    Ich habe einen Freund nach einem Tipp gefragt und er schlug mir fflush (stdin) vor. Funktionierte leider auch nicht, bis ich in der MSDN unter fflush nachgesehen habe und sah, dass es dort nicht mit cin.get () sondern mit gets () verwendet wird. Aber warum funktioniert es mit gets () und mit cin.get () nicht?

    Erstens: "fflush(stdin)" ist Schrott - sofort wieder vergessen.

    Zweitens: stdin und cin arbeiten zwar auf dem selben Eingabekanal (Tastatur), sind aber deswegen noch lange nicht uneingeschränkt kombinierbar. (und überhaupt ist es selten eine gute Idee, C und C++ Methoden zu vermischen)


Anmelden zum Antworten