Verständnisprobleme bei simplen Ablauf



  • Hey Leute,
    mein Problemchen ist eines was sicherlich hier und da einige Anfänger schonmal hatten aber ich komme schlichtweg zu keiner Lösung...

    Mein Code ist in sekundenschnelle überflogen und ich komme direkt zum Punkt.

    #include <iostream>
    #include <string>
    
    int main()
    {
        int number;
        std::string name;
    
        std::cout << "Please enter a Number: ";
        std::cin >> number;
        
        if (number < 5)
        {
            std::cout << "Bitte Namen eingeben: ";
            std::getline(std::cin, name);
        }
        
        if (name != "")
        {
            std::cout << name << std::endl;
        } else {
            std::cout << "Time to say Goodbye ;)" << std::endl;
        }
    
        return 0;
    }
    

    Im Terminal wird mir selbst bei Eingabe einer Zahl < 5 aber keine Eingabemöglichkeit für den Namen ausgegeben wie ich es eigentlich erwarten würde durch den getline Aufruf weshalb ich mich an euch wende. Ums kurz zu machen ich verstehe nicht warum ich keine Namenseingabe bekomme.

    Hier noch die Terminalausgabe:
    Terminalbild



  • Das liegt daran, dass cin >> number nur die Zahl einliest. Du gibst aber "Zahl + Enter" ein. Das "Enter"-Zeichen ist noch im Stream drin. Daher liest das folgende getline auch 0 Zeichen (und das Enter) ein.

    Das kann bei Streams sehr merkwürdig sein. Immer dran denken, dass noch Zeichen im Eingabestrom von der vorherigen Eingabe sein können.

    Mit std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); kannst du alle Zeichen bis zum folgenden Enter entfernen. Führe dies vor dem getline aus (nebst #include <limits>).



  • Dieser Beitrag wurde gelöscht!


  • @wob recht herzlichen Dank 👍🏻



  • @OwnliE sagte in Verständnisprobleme bei simplen Ablauf:

    @wob recht herzlichen Dank 👍🏻

    In deiner alten Version hättest du auf die Frage nach der Zahl gleich "3 Max Mustermann<enter>" eingeben können, dann hättest du das gewünschte Verhalten gehabt. Mit dem ignore wird jetzt das " Max Mustermann<enter>" aus dem Stream entfernt.



  • @wob Ziel war es ja hier explizit die Zahl und danach gesondert den Namen einzugeben. So funktioniert es wie gewünscht.



  • @OwnliE sagte in Verständnisprobleme bei simplen Ablauf:

    @wob Ziel war es ja hier explizit die Zahl und danach gesondert den Namen einzugeben. So funktioniert es wie gewünscht.

    Schon klar. Ich wollte nur zum Verständnis beitragen:

    • >> int_variable überspringt führenden Leerraum (Space, Enter, ...) und liest dann solange wie geht Ziffern aus dem Stream ein, hört am ersten Nicht-Ziffernzeichen auf (das verbleibt im Stream)
    • getline(stream, string_var) liest bis zum '\n'-Zeichen, das dann aus dem Stream entfernt wird, aber nicht in string_var landet.
    • du kannst das Verhalten von Streams auch ändern, z.B. mit skipws.

Anmelden zum Antworten