Leertaste in einer String Variable
-
Hi ich beschäftige mich erst seit kurzem mit C++, heute habe ich versucht eine Simulation zu Programmiern bin aber stecken geblieben bei einem problem.
Folgendes, ich wollte in einer string variable eine leertaste schreiben aber das wird vom compiler ignoriert oder sowas, und als ich im programm dann das selbe schrieb was in der variable ist hat er sie nicht erkannt.
#include <iostream.h> #include <string> int main() { std::string eingname; const std::string FIRSTACC = "Test Name"; const std::string SECONDACC = "Peter"; const std::string THIRDACC = "Shissl Manissl"; cout << "Willkommen.\nDas ist die Einlogg-Software der HoslingerBank.\nBitte Loggen Sie sich ein.\n\n"; cout << "Benutzername: "; cin >> eingname; if ((eingname == FIRSTACC) || (eingname == SECONDACC) || (eingname == THIRDACC)) { cout << "OK!\n"; } system("pause"); }danke schonmal
-
Von welchem Leerzeichen redest du?
-
Das liegt daran das cin nur bis zum nächten Space liest. getline sollte sein was du suchst:
std::getline(std::cin, eingname);Außerdem solltest du statt iostream.h nur iostream benutzen (dann sind auch cin und cout im std-Namespace).
Greetz
-
ey danke für die schnelle hilfe xD
aber was bringt das std:: eigentlich
-
²DooM² schrieb:
ey danke für die schnelle hilfe xD
aber was bringt das std:: eigentlichhi,
Also es ist ein Namensbereich,aber
using namespace std;damit kannst das sozusagen entfernen^^
mfg daniel

-
okay danke, also ich hab jetzt brav weiter geschrieben und bin auf ein weiteres problem gestoßen hoffe um hilfe ich grübel schon 1 stunde rum, sry wenn das langsam belästigent wird ^^.
Wär hamma wenn ihr mir helfen könnt!
Das problem ist einfach das wenn es nachdem man den Menüpunkt 1. wählt das programm automatisch schließt wobei Zeile 37 noch angezeigt wird und es anschließend sofort zu zeile 92 springt#include <iostream> #include <string> void login(); std::string eingname; // Eingebener Benutzername std::string eingpin; // Eingebene PIN std::string mompin; // PIN wird an Benutzername zugewiesen mit dieser Variable int start; const std::string FIRSTACC = "Peter Mauer"; const std::string SECONDACC = "Silo Gernandes"; const std::string THIRDACC = "Sebastian Witz"; const std::string FIRSTPW = "12345"; const std::string SECONDPW = "11223"; const std::string THIRDPW = "12233"; int main() { std::cout << "Willkommen.\nDas ist die Einlogg-Software der HoslingerBank.\nBitte Loggen Sie sich ein.\n\n"; std::cout << "1. Einlogen\n2. Beenden\n"; std::cout << "Menuepunkt: "; std::cin >> start; // soll einfach zwischen menüpunkt 1 oder 2 wählen if (start == 1) std::cout << "Login: \n"; login(); // hier soll es zur login funktion gehen aber wenn er da... // ankommt schließt das programm automatisch da liegt mein problem if (start == 2) { std::cout << "\nBye!\n\n"; system("pause"); } } void login() { std::cout << "Benutzername: "; //Die Zeile wird noch angezeigt danach // springt es jedoch direkt zu Zeile 92 std::getline(std::cin, eingname); if (eingname == FIRSTACC) { mompin = FIRSTPW; std::cout << "Benutzername OK!\n"; std::cout << "\nPIN: "; std::getline(std::cin, eingpin); if (eingpin == mompin) { std::cout << "PIN OK!\n"; std::cout << "\nLogin OK!\n\n"; } else std::cout << "\nPIN Falsch!\n\n"; } if (eingname == SECONDACC) { mompin = SECONDPW; std::cout << "Benutzername OK!\n"; std::cout << "\nPIN: "; std::getline(std::cin, eingpin); if (eingpin == mompin) { std::cout << "PIN OK!\n"; std::cout << "\nLogin OK!\n\n"; } else std::cout << "\nPIN Falsch!\n\n"; } if (eingname == THIRDACC) { mompin = THIRDPW; std::cout << "Benutzername OK!\n"; std::cout << "\nPIN: "; std::getline(std::cin, eingpin); if (eingpin == mompin) { std::cout << "PIN OK!\n"; std::cout << "\nLogin OK!\n\n"; } else std::cout << "\nPIN Falsch!\n\n"; } if ( (eingname != FIRSTACC) & (eingname != SECONDACC) & (eingname != THIRDACC) ) std::cout << "\nDieser Benutzername existiert nicht in der Datenbank!\n\n"; }
-
geht auch mit get()
-
Nach der Eingabe
cin>>start;im Hauptprogramm bleibt noch das ENTER-Zeichen im Tastaturpuffer zurück, das dann vom getline() eingelesen wird - im Ergebnis landet in 'eingname' ein leerer String, der dannn atürlich mit keinem der Accounts übereinstimmt. Dieses Zeilenende mußt du per ignore() entsorgen.btw, diese Code-Duplikation ist grauenhaft - wenn du weitere Nutzer anlegst, blickst du bald gar nicht mehr durch. Pack lieber alle Nutzerdaten in eine map<> und schreib den Login-Vorgang nur einmal:
map<string,string> accounts; void init()//einmal am Anfang der main() aufrufen { accounts.insert(make_pair("Peter Mauer","12345"); ... //Eventuell kannst du die User-Daten auch in eine externe Datei packen und über fstream einlesen } bool login() { string user,pw; cout<<"Username:"; getline(cin,user); map<string,string>::iterator pos=accounts.find(user); if(pos!=accounts.end()) { cout<<"Passwort:"; getline(cin,pw); if(pw==pos->second) { cout<<"Login erfolgreich"<<endl; return true; } else { cout<<"falsches Passwort"<<endl; return false; } } else { cout<<"unbekannter Nutzer"<<endl; return false; } }
-
wow super danke
-
Nur mal so nebenbei:
if ( (eingname != FIRSTACC) & (eingname != SECONDACC) & (eingname != THIRDACC) )Statt & schreibt man an dieser Stelle &&. && ist ein logisches "Und", wie man es in menschlicher Denkweise tatsächlich verwendet: "Wenn eingname ungleich FIRSTACC und eingname ungleich SECONDACC und eingname ungleich THIRDACC". Während & ein bitweises "Und" ist, das eigentlich nur bei binären Verknüpfungen von Zahlen genommen wird.
Ein praktisches Beispiel, wo die Unterschiedlichkeit hervorkommt: Es gilt:
9 && 10 == true == 1(alle Werte ungleich Null werden als true angesehen und true && true == true)
und es gilt:9 & 10 == 8denn hier wird Bit für Bit berechnet:
1001 (binär, entspricht 9) &1010 (binär, entspricht 10) ----- =1000 (binär, entspricht 8)Hätte man zum Beispiel die Abfrage
if (1 && 2)würde es einen gewaltigen Unterschied machen, ob man && oder & schreibt, denn
1 && 2 == trueda 1==true und 2==true und true&&true==true.
Aber
1 & 2 == 0 == falsedenn
0001 &0010 ----- =0000