Strings mit Leerzeichen einlesen
-
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