'getline' funktioniert nach 'cin' nicht



  • Das folgende Programm funktioniert so wie erwartet.

    / getline after cin
    
    #include <iostream>  
    #include <string>   
    using namespace std;
    
    string answer_1,answer_2;
    int number;
    
    int main () {
    
      cout<<endl;
    /*  
      cout << "Enter a number: ";
      cin >> number;
      cout <<"\n"<< number <<endl;
    */
    
      cout << "Enter a string: ";
      getline (cin,answer_1);
      cout<<"\n"<< answer_1<<"  "<<answer_1.size() << endl;
    
      cout << "Enter another string: ";
      getline (cin,answer_2);
      cout<<"\n" << answer_2<<"  " <<answer_2.size() << endl;
    
      return 0;
    }
    

    Wenn ich den stillgelegten Teil aktiviere:

    // getline after cin
    
    #include <iostream>  
    #include <string>   
    using namespace std;
    
    string answer_1,answer_2;
    int number;
    
    int main () {
    
      cout<<endl;
      
      cout << "Enter a number: ";
      cin >> number;
      cout <<"\n"<< number <<endl;
    
    
      cout << "Enter a string: ";
      getline (cin,answer_1);
      cout<<"\n"<< answer_1<<"  "<<answer_1.size() << endl;
    
      cout << "Enter another string: ";
      getline (cin,answer_2);
      cout<<"\n" << answer_2<<"  " <<answer_2.size() << endl;
    
      return 0;
    }
    

    sieht das Ergebnis so aus: (von der Konsole kopiert)

    C:\Users\fried\Desktop\C++>a

    Enter a number: 12345

    12345
    Enter a string:
    0
    Enter another string: zweiter string

    zweiter string 14

    D.h. das erste 'getline' nach der Eingabe einer Zahl mit 'cin' wartet die Eingabe gar nicht ab!

    Was ist der Grund und was kann ich dagegen machen?

    fribir



  • @fribir sagte in 'getline' funktioniert nach 'cin' nicht:

    wartet die Eingabe gar nicht ab!

    So funktionieren Strams nicht. Streams warten auf garnichts und auch die dazugehörigen Funktionen nicht. Wenn Du mit operator>>() einen integer liest steht alles was nicht auf einen Integer matcht immer noch im Stream, also wahrscheinlich zumindest ein Newline '\n' das dann per std::getline() in deinem String landet. Leere den Stream nach dem Einlesen der Zahl. Der Klassiker:

    #include <limits>
    // ...
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    


  • Das haben @wob und ich dir doch schon in deinem anderen Thema Laufzeitfehler mit std::stof vor über einer Woche geschrieben.
    Wenn du es nicht verstanden hast bzw. nicht weißt, wie man damit umgeht, dann hättest du nachfragen sollen, anstatt ein neues Thema anzufangen.



  • @Th69 ah, noch ein Yadgar.



  • Hallo!
    Vielen Dank für die Antwort!
    Ein neues Thema habe ich angefangen, weil ich das Problem ohne zuviel herum darstellen wollte. Es stimmt, dass auch das letzte mal die Antwort dabei war, ich konnte aber nichts damit anfangen.
    Was ein Yadgar ist, weiss ich nicht, sorry.
    Fribir



  • @fribir sagte in 'getline' funktioniert nach 'cin' nicht:

    Ein neues Thema habe ich angefangen, weil ich das Problem ohne zuviel herum darstellen wollte. Es stimmt, dass auch das letzte mal die Antwort dabei war, ich konnte aber nichts damit anfangen.

    Und? Jetzt Durchblick?

    Was ein Yadgar ist, weiss ich nicht, sorry.

    Ein Yadgar ist eine Einheit für Lernresistenz. Ein bis zwei Jagdar ist schon ziemlich hoch. Drei Sprengt beinahe die Skala. Braucht Dich nicht kümmern.



  • Durchblick besser, danke.
    Wer die Antwort kennt, dem scheint die Frage dumm.
    fribir



  • Ich muss zugeben, dass ich auch lange gebraucht habe, um Streams halbwegs zu verstehen. Das Konzept stimmt häufig nicht mit dem überein, wie ich über Eingaben nachdenke. Besonders, wenn diese von der Tastatur erfolgen. Und mit der Ausgabe (irgendwelche Formate setzen, aber unbedingt vorher irgendwie den State speichern und danach wiederherstellen, damit man nicht anderswo für Überraschungen sorgt...) konnte ich mich nie recht anfreunden. Mit Dingen wie imbue auch nicht, das wirkt immer alles irgendwie kompliziert.

    Zum Glück gibt es da ja inzwischen zum Ausgeben fmtlib bzw. std::format und co.


Anmelden zum Antworten