Anfängerfrage zu Getline



  • Hallo, ich bin der Neue 🙂

    Ich schreibe zZt ein kleines Programm auf dem Raspberry Pi, was mir Code auf der seriellen Schnittstelle ausgibt.

    Ich habe zwei kleine "Menüs", wo die Auswahl mit cin eingelesen wird. Kein Problem. Jetzt möchte ich einen String mit Leerzeichen einlesen und bin deshalb auf getline angewiesen. Soweit so gut, die übliche Syntax ist mir bekannt, aus irgendeinem Grunde will es aber nicht funktionieren:

    void fbm_menu ()
    {
    int x = 1;
    
    while (x == 1){
    
    printf("\033[2J");
    cout << "[ 1 ] string schreiben" << std::endl;
    cout << "[ 2 ] reset" << std::endl;
    cout << "[ 3 ] back" << std::endl;
    cout << "Eingabe: ";
    int vote;
    cin >> vote;
    
    if (vote == 1)
    {
    
    		char eingabe[100];
    		string mystr;
    		cout << "" << std::endl;
    		cout << "Text eingeben: ";
    		getline (cin,mystr);				// GETLINE-PROBLEM
    		strcpy(eingabe,mystr.c_str());
    
    		int laenge = strlen(eingabe);
    
    		if (laenge < module+1){
    
    		fbm_write_str(eingabe);
    		}
    
    		else {
    		char exception[]= "too long";
    		fbm_write_str(exception);
    		}
    		}
    
    else if (vote == 2)
    {
     fbm_reset();
    		}
    
    else{ x = 0;}
    
    }
    }
    

    ich habe es auch mit cin.getline(eingabe,99); probiert, also direkt als Char Array. Der Fehler ist identisch und zeigt sich wie folgt:

    Bei Auswahl von Menüpunkt 1 wird sofort ein komplett leeres Array an die fbm_write_str() geschickt. Es gibt keinerlei Eingabemöglichkeit.

    Mittlerweile glaube ich an einen ganz bösen Anfängerfehler, da mein Problem ja offensichtlich mit solch einem einfachen Beispiel vergleichbar ist:
    http://www.java2s.com/Code/Cpp/File/Usegetlinetoreadastringthatcontainsspaces.htm

    Trotzdem geht es nicht, die Funktion fbm_write_str() wird ausgeführt ohne dass ich überhaupt eine Eingabe tätige.

    Über einen Wink mit dem Zaunpfahl wäre ich dankbar. Ein cin >> mystr; an dieser Stelle funktioniert einwandfrei, nur brauche ich eben Leerzeichen.

    Viele Grüße und eine gute Woche,
    Julian



  • ...

    P.S: Zu schnell getippt. Kann gelöscht werden


  • Mod

    eddi0815 schrieb:

    Nimm doch einfach std::string.

    http://www.cplusplus.com/reference/string/getline/

    +1, jedoch nicht das eigentliche Problem. Das eigentliche Problem hat wohl jeder Erstnutzer von getline: operator>> trennt Eingaben an Whitespaces, ohne diesen mit aus dem Stream zu lesen. getline trennt an newlines ('\n', auch eine Form von Whitespace), liest diese aber mit aus dem Stream. Wenn nun jemand als Beispieleingabe "1\nHallo Welt\n" eingibt, dann wird in Zeile 13 die '1' gelesen und beim '\n' aufgehört. Im Eingabestrom befindet sich nun "\nHallo Welt\n". Das darauf folgende getline in Zeile 25 liest bis zum ersten '\n' welches es findet. getline wird schon beim ersten Zeichen fündig, ist also sofort fertig und liest gar nichts. Im Eingabestrom befindet sich nun "Hallo Welt\n".



  • Vielen Dank für die Erklärung!

    Als Lösung fällt mir jetzt nur ein, auch oben mit getline zu arbeiten. Werde das gleich mal testen.

    Dein Einwand von eddi0815 verstehe ich (unabhängig) vom Problem nicht ganz. Meine Syntax ist doch gleich?

    edit: Habe jetzt überall getline verwendet und es funktioniert wie gewünscht.
    Danke noch einmal für die super schnelle Hilfe.



  • Wie gesagt, ich habe meine Antwort zu schnell gegeben. Ich habe dabei übersehen, daß du ja schon mit string arbeitest.



  • Mich machte das "+1" von Sepp stutzig 😉

    Vielleicht meinte er aber auch nur, dass eine konsequente Nutzung von string besser ist.


  • Mod

    Subi88 schrieb:

    Vielleicht meinte er aber auch nur, dass eine konsequente Nutzung von string besser ist.

    So ist es.


Anmelden zum Antworten