Strings mit Leerzeichen einlesen



  • Hi!

    Stringo schrieb:

    oder war das andersrum?

    nee. nur die string-variable sollte besser nicht string heißen.

    Ja, 'string' sollte auch nur zeigen, das dort eine Stringvariable erwartet wird. 🙂

    Zum leeren des Puffers gibt es hier genug. cin.clear() löscht die gesetzten Fehlerflags. Versuch es mal damit:

    cin.sync(); //Leert den Eingabepuffer
    cin.clear();
    

    Wenn diese Lösung nicht hilft, dann such mal, es gibt noch eine Möglichkeit den Eingabepuffer zu leeren.
    Das Verhalten von fflush() ist undefiniert. Was aber noch funktionieren könnte ist:

    while(getchar()!='\n');
    

    Code-Hacker



  • Verdammt! 😡
    Warum gehen alle Befehle nicht, außer der hier?

    Code-Hacker schrieb:

    while(getchar()!='\n');
    

    Das ist mal ziemlich billig! Wenn ich es richtig verstehe, wartet er solange, bis Enter gedrückt wird, oder?

    Liebe Grüße
    Real



  • Mist!
    Jetzt merke ich, dass mein Vorname nicht gespeichert wird, obwohl er eingelesen wird!



  • Versuche es doch noch mal mit getline() und gebe als delemiter einfach '\n' an!

    Ein Beispiel ist auch in der Doku:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrf_string_getline_class.asp



  • Du meinst so?

    getline(cin, vorname, cin.widen('\n'));
    

    Geht auch nicht. Versteh nicht, warum es bei so einer simplen Sache Probleme gibt!

    Liebe Grüße
    Real



  • Hi!

    Nein, die Schleife holt alle Zeichen aus dem Puffer und guckt ob es sich um ein '\n' handelt. Wenn ja, dann bricht die Schleife ab. Ansonsten versuch mal statt cin.sync():

    std::cin.ignore(std::cin.rdbuf()->in_avail());
    

    getline verwendet für das Zeilenende standardmäßig '\n' als Trennzeichen.

    Code-Hacekr



  • Hi!

    Du solltest die neuen Header verwenden (ohne .h am Ende) und zusätzlich noch den Namensbereich std global verfügbar machen:

    using namespace std;
    

    Code-Hacker



  • Code-Hacker schrieb:

    std::cin.ignore(std::cin.rdbuf()->in_avail());
    

    Danke das funktioniert. Kannst du mir mal übersetzen, was das heisst?

    Liebe Grüße
    Real



  • Hi!

    ignore() ignoriert eine bestimmte Anzahl von Zeichen. Standardmäßig ist da 1 gesetzt. rdbuf liefert den Puffer. in_avail() liefert die Anzahl der im Puffer vorhandenen zeichen. Somit werden alle Zeichen im Puffer überlesen.

    Code-Hacker



  • Ich habe mal etwas mit getline() ausprobiert, da ich es auch ganz gut gebrauchen könnte, dabei würde ich gerne wissen, warum ich 2 mal die Return-Taste drücken muss, wenn ich meinen string eingegeben habe?

    void main(){
    	string dateipfad = "c:\\games\\tetris spielen";
    	cout<<"Dateipfad eingeben:";
    	string eingabe;
    	getline(cin, eingabe);
    	if (dateipfad.compare(eingabe) == 0){
    		cout<<"Beide Strings sind gleich!"<<endl;
    	} else{
    		cout<<"Beide Strings sind ungleich!"<<endl;
    	}
    
    }
    

    Basti


Anmelden zum Antworten