Schleife bricht nicht ab bei " == '\n'" Bedingung



  • Warum bricht er da nicht ab:

    int main()
    {
        string temp;
        string save;
        while(cin >> temp)
        {
            if(save != "" && save == temp)
            {
                cout << "Same word order!" << endl;
                cout << save << " = " << temp << endl;
                break;
            }
            if(temp[temp.size()] == '\n') // HIER!
            {
                cout << "CIN-Buffer read to end!" << endl;
                break;
            }
            save = temp;
        }
    

    Wenn ich zum Beispiel "Er zieht durchs Land" eingebe, dann müsste doch beim letzten ausgelesenen Wort der letzte Buchstabe '\n' sein (weil man ja mit Enter die Eingabe bestätigt)? Und somit könnte ich erkennen, ob ich beenden will oder nicht?
    Was mach ich falsch?

    MfG
    Stromberg



  • Wenn ich zum Beispiel "Er zieht durchs Land" eingebe, dann müsste doch beim letzten ausgelesenen Wort der letzte Buchstabe '\n' sein (weil man ja mit Enter die Eingabe bestätigt)? Und somit könnte ich erkennen, ob ich beenden will oder nicht?

    Enter ist aber \r.

    Guck doch mal was drin steht...
    Simon



  • verusch mal temp.size() - 1 weil temp.size() hinter dem letzten ist



  • Weder mit '\r' nocht mit size() -1 funktionirt es 😞

    MfG
    Stromberg


  • Administrator

    \r\n wird bei dieser Anweisung gar nicht erst eingelesen. Das Zeug bleibt im std::cin Puffer drin und kommt nicht in deine temp Variable. Leerzeichen werden bei operator >> standardmässig ignoriert.

    Grüssli



  • Und wie würdest du dann die Abbruchbedingung gestalten? Also für des Enter, wenn alle Wörter eingelesen wurden?

    MfG
    Stromberg


  • Administrator

    #include <string>
    #include <sstream>   // Für std::istringstream
    #include <iostream>
    
    int main()
    {
      std::string line;
      std::geline(std::cin, line);
    
      // Verwende nun zum Beispiel Boost.Tokenizer
      // oder trenne die Teile von Hand auf.
    
      // Du kannst auch sowas machen:
      std::string word;
      std::istringstream iss(line);
    
      // iss ist so lange gültig, wie es etwas im Puffer hat.
      // Sobald also das ende von line erreicht wurde,
      // bricht die Schleife ab.
      while(iss >> word)
      {
        // ...
      }
    
      // ...
    
      return 0;
    }
    

    Grüssli


Anmelden zum Antworten