getline()



  • ich habe folgenden code zusammengebastelt
    leider funktioniert das mit getline() nicht bei der methode TextPram nicht meine ausgabe ist dann folgende?

    text?
    x?

    also das prog macht anscheinend gleich ein Return \n
    Wieso ich checks nicht!?!?! 😕

    void Input::choose ()
    {
     string input_;
     int choice;
     int textCounter;
     for (;;)
     {
       cout << "svg> ";
       cin >> input_;
       choice = CheckInput (input_);
       if (choice == quit)
         break;
       switch (choice)
        {
        case text:
         TextParam ();
         break;
        case image: cout << "test Image" << endl;
         break;
        case polygon:cout << "test polygon" << endl;
         break;
        case list:cout << "test list" << endl;
         break;
        case save:cout << "test save" << endl;
         break;
        case notIdentified:
         break;
        default: break;
        }
     }
    }
    
    void Input::TextParam ()
    {
     string input_;
     cout << "text? ";
     getline (cin, input_);
     cout << input_;
     vText.push_back (input_);
     cout << vText[0];
     do
     {
       cout << "\nx? ";
       cin >> input_;
     } while (!CheckForInt (input_));
     vText.push_back (input_);
    
     do
     {
       cout << "\ny? ";
       cin >> input_;
     } while (!CheckForInt (input_));
     do
     {
       cout << "\nx? ";
       cin >> input_;
     } while (!CheckForInt (input_));
     vText.push_back (input_);
     /* cout << "\nfill? " <<;
      cin >> input_;
      text1.push_back (input_);
      cout << "\ngroup? " <<;
      cin >> input_;
      text1.push_back (input_);*/
    
    }
    


  • hallo und bitte natürlich hab ich ganz vergessen! 😉


  • Mod

    Das ist noch das newline-Zeichen von der vorherigen Eingabe. Dort hast du nämlich einen int über den Operator >> eingelesen. Der Operator >> hat dabei in den Eingabestream geguckt und so lange Zeichen daraus gelesen, wie diese Zeichen Ziffern waren. Das erste Zeichen welches keine Ziffer war, war das newline-Zeichen, das du zur Bestätigung der Eingabe der Zahl eingetippt hast. Bei diesem Zeichen hat der Operator >> Schluss gemacht und es ist daher bei der nächsten Eingabeoperation das erste Zeichen im Eingabestream. Und da getline() bis zum nächsten newline-Zeichen liest, liest es bei der nächsten Operation gar nichts ein.

    Lösungsvorschläge:
    - Zwischendurch den ganzen Eingabepuffer leeren (mit ignore())
    - Zwischendurch das nächste newline-Zeichen ignorieren (ebenfalls mit ingore())
    - Immer nur getline verwenden, auch wenn man Zahlen einliest
    - Da dies auf ein reines Tastatureingabesystem hinausläuft, kannst du auch gleich eine Bibliothek verwenden, die auf reine Tastatureingaben spezialisiert ist (z.B. ncurses für Linux-Konsolen)



  • danke für deine hilfe hat funktioniert.
    leider darf ich dies bibliothek nicht benutzen 😞

    ich habe gerade bemerkt, dass wenn ich bei x? 1 2 eingebe das leerzeichen in meiner checkForInt methode nicht erkannt wird und der string inkl. leerzeichen in meinen vektor gespeichert wird.

    ich dachte mit isdigit erkennt er nur zahlen

    bool Input::CheckForInt (string param)
    {
     for (int i = 0; i < param.length (); i++)
     {
       if (isdigit (param[i])) // vl größer kleimer ascii
       {
         if (param.length () == i + 1)
         {
           return true;
         }
       }
     }
     return false;
    }
    

  • Mod

    Du musst nicht selber auf int prüfen. Nutz einfach den Operator >>. Der erkennt das automatisch. War die Eingabe keine Zahl, obwohl eine erwartet wurde, so wird das Fehlerflag des Streams gesetzt.



  • hab noch isblank eingebaut

    bool Input::CheckForInt (string param)
    {
     if (param == "Space")
       return false;
     for (int i = 0; i < param.length (); i++)
     {
       if (isblank (param[i]))
         return false;
    
       if (isdigit (param[i])) // vl größer kleimer ascii
       {
         if (param.length () == i + 1)
         {
           return true;
         }
       }
     }
     return false;
    }
    

Anmelden zum Antworten