Strings mit Leerzeichen einlesen



  • Hi,
    erst mal eine Frage:
    Warum kann ich mit cin keine Strings mit Leerzeichen einlesen?

    Dann würde ich gerne wissen, wie man Strings mit Leerzeichen einliest. Also ich meine richtige Strings (string.h) keine Char-Arrays, denn dazu habe ich die Lösung schon (cin.get(char-variable, länge)).

    Danke im Voraus

    Liebe Grüße
    Real

    PS: Bei Google habe ich nichts gefunden.



  • Hi!

    1. Die Header heißt nur string (ohne .h)
    2. getline(cin, string); (oder war das andersrum?)

    Code-Hacker



  • oder war das andersrum?

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



  • Das ist aber witzig. Jetzt wird der Befehl übersprungen und ich werde aufgefordert meinen Nachnamen einzugeben!

    #include <iostream.h>
    #include <string.h>
    #include <fstream.h>
    
    ...
    ...
    
    switch(menu){
       case 1:{
       system("cls");
    
       cout<< "Bitte Vornamen eingeben:" <<endl;
       getline(cin, vorname);
       //cin>> vorname;
    
       cout<< "Bitte Nachnamen eingeben:"<<endl;
       cin>> nachname;
    
      ...
      ...
    

    Woran liegt das?

    Liebe Grüße
    Real



  • Dann must du noch deinen Eingabepuffer leeren



  • Hab das mal mit cin.clear() versucht, geht aber nicht!

    Liebe Grüße
    Real



  • Da du ja eh mit system() arbeitest, kannst du eigentlich auch noch ein fflush(stdin) einbauen...



  • Geht immernoch nicht!

    Hier mal der komplette Quellcode (Borland C++ Builder 5)

    #include <iostream.h>
    #include <string.h>
    #include <fstream.h>
    
    class Konto{
          private:
          string vorname, nachname, geheimnummer;
          int kontonummer;
          int kontostand;
    
          public:
          string getGeheimnummer(){
            return geheimnummer;
          }
    
          int getKontostand(){
            return kontostand;
          }
    
          void setGeheimnummer(string &neueGeheimnummer){
               geheimnummer = neueGeheimnummer;
               cout<< "Geimnummer: " << geheimnummer <<endl<<endl;
          }
    
          void setName(string &neuerVorname, string &neuerNachname){
    
               vorname = neuerVorname;
               nachname = neuerNachname;
    
               cout<< vorname << " " << nachname << endl<<endl;
          }
    
          void setKonto(int &neueKontoNummer){
               kontonummer = neueKontoNummer;
               cout<< "Kontonummer: " << kontonummer <<endl<<endl;
          }
    
          void setKontostand(int &neuerKontostand){
               kontostand += neuerKontostand;
               cout<< "Neuer Kontostand: " << kontostand << " Euro" <<endl<<endl;
          }
    
          void drucken(){
               ofstream out("datei.txt");
               out<< vorname << " " << nachname <<endl;
               out<< "Kontonummer: " << kontonummer <<endl;
               out<< "Kontostand: " << kontostand;
    
               cout<< "Kontostand: " << kontostand <<endl<<endl;
          }
    };
    
    void main(){
    Konto kontos[1000];
    
    int counter = 0;
    int menu;
    int kontonummer = 5300000;
    string vorname, nachname, geheimnummer;
    
    do{
       cout<< "[1] Neues Konto erstellen"<<endl;
       cout<< "[2] Einzahlen" <<endl;
       cout<< "[3] Abheben" <<endl;
       cout<< "[4] Kontoauszug" <<endl;
       cout<< "[5] Beenden" <<endl;
    
       cin>> menu;
    
       switch(menu){
       case 1:{
       system("cls");
    
       cout<< "Bitte Vornamen eingeben:" <<endl;
       cin.clear();
       fflush(stdin);
       getline(cin, vorname);
       //cin>> vorname;
    
       cout<< "Bitte Nachnamen eingeben:"<<endl;
       cin>> nachname;
    
       cout<< "Bitte geben Sie ihre gewuenschte Geheimnummer ein:" <<endl;
       cin>> geheimnummer;
    
       system("cls");
    
       cout<< "Ein Konto wurde mit folgenden Daten erstellt:" <<endl<<endl;
    
       kontos[counter].setName(vorname, nachname);
       kontos[counter].setKonto(kontonummer++);
       kontos[counter].setGeheimnummer(geheimnummer);
    
       counter++;
       break;
       }
    
       case 2:{
       system("cls");
    
       int einzahlung;
       cout<< "Bitte geben Sie ihre Geheimnummer ein: "<<endl;
       cin>> geheimnummer;
    
       for(int i = 0; i<= counter; i++){
         if(kontos[i].getGeheimnummer() == geheimnummer){
           system("cls");
           cout<< "Wieviel moechten Sie einzahlen?" <<endl;
           cin>> einzahlung;
    
           system("cls");
    
           kontos[i].setKontostand(einzahlung);
           break;
         }
    
         else{
           system("cls");
           cout<< "Falsche Geheimzahl eingegeben" <<endl<<endl;
         }
       }
       break;
       }
    
       case 3:{
       system("cls");
    
       int abhebung;
       cout<< "Bitte geben Sie ihre Geheimnummer ein: "<<endl;
       cin>> geheimnummer;
    
       for(int i = 0; i<= counter; i++){
         if(kontos[i].getGeheimnummer() == geheimnummer){
           system("cls");
           cout<< "Wieviel moechten Sie abheben?" <<endl;
           cin>> abhebung;
    
           system("cls");
    
           kontos[i].setKontostand(-abhebung);
           break;
         }
    
         else{
           system("cls");
           cout<< "Falsche Geheimzahl eingegeben" <<endl<<endl;
         }
       }
       break;
       }
    
       case 4:{
       system("cls");
    
       cout<< "Bitte geben Sie ihre Geheimnummer ein: "<<endl;
       cin>> geheimnummer;
    
       for(int i = 0; i<= counter; i++){
         if(kontos[i].getGeheimnummer() == geheimnummer){
           system("cls");
    
           kontos[i].drucken();
           break;
         }
    
         else{
           system("cls");
           cout<< "Falsche Geheimzahl eingegeben" <<endl<<endl;
           }
         }
       break;
       }
    
       default:{
         system("cls");
         cout<< "Falsche Eingabe!"<<endl<<endl;
         break;
         }
       }
    
    }while(menu != 5);
    
    //cin.get();
    }
    

    Liebe Grüße
    Real



  • 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