[Anfänger] Warum funktioniert mein Code nicht (Problem mit cin-Stream)
-
Guten Tag!
Also ich versuche eine Funktion zu erstellen, die Prüft ob mein String die Form n-n-n-x hat, wobei n eine ganze Zahl sein soll und x entweder eine Zahl oder ein Buchstabe.
#include <iostream> #include <string> bool is_isbn(string s) { int k; int i; char ch; int val; for (k=0; k<s.size(); k++) {cin.putback(s[k]);} //---Hier scheint der cin plötzlich unendlich voll mit Leerzeichen zu sein! for (i=0; i<3;i++) { val = 0; cin >> val; if (val<0) return false; ch = 0; cin >> ch; if (ch!=45) return false; } val = -1; cin>>val; if (val<0) { char ch = 0; cin >> ch; if (!isalpha(ch)) return false; } return true; } int main () { cout << is_isbn("53-53-53-53") << endl; return 0; }
Ich habe mal einen Kommentar eingefügt wo meiner Meinung nach das Problem steckt und den Code abgewandelt, so dass er kopiert und kompiliert werden kann.
-
Wie kommst du auf die Idee, einen String nach cin zu packen? Wenn du mit Strings und Streams arbeiten möchtest, verwende einen stringstream.
-
Hm ja, aber ich möchte verstehen warum dass nicht klappt. Chars einlesen mit cin funktioniert doch für gewöhnlich, und ich lese den String eben Charweise ein oder nicht?
Also ich verstehe schon, dass es sicherlich bessere Möglichkeiten gibt das Problem zu lösen.
Hier geht es mir aber viel mehr darum zu verstehen warum das so nicht klappt.
-
Ich möchte mit meinem Auto fliegen. Das klappt aber nicht. Wenn ich über die Klippe fahre, fällt es einfach nur nach unten. Klar, die Lösung mit dem Flugzeug ist besser, aber ich möchte verstehen, warum das nicht mit dem Auto geht.
-
Thez schrieb:
Hm ja, aber ich möchte verstehen warum dass nicht klappt. Chars einlesen mit cin funktioniert doch für gewöhnlich, und ich lese den String eben Charweise ein oder nicht?
Also ich verstehe schon, dass es sicherlich bessere Möglichkeiten gibt das Problem zu lösen.
Hier geht es mir aber viel mehr darum zu verstehen warum das so nicht klappt.
putback ist nicht dafür gedacht, beliebig viele Zeichen in den Inputstream zu schreiben und schon gar nicht irgendwelche Zeichen, die Du gar nicht gelesen hast.
Nimm strstream oder iteriere selber durch den string.
-
Thez schrieb:
Hier geht es mir aber viel mehr darum zu verstehen warum das so nicht klappt.
putback schlägt fehl, weil du Zeichen in cin zurückzuschieben versuchst, die du nie herausgelesen hast.
-
Na gut alles klar. Ich dachte es ginge, hatte hinter dem putbackbefehl, mal
char ch; cin >> ch; cout << ch << endl;
eingefügt und da gab er mir alles aus.
putback ist nicht dafür gedacht, beliebig viele Zeichen in den Inputstream zu schreiben und schon gar nicht irgendwelche Zeichen, die Du gar nicht gelesen hast.
Ja, ich hab mal rumprobiert und für 1 Zeichenlange Strings geht es logischer Weise. Die putbackfunktion funktioniert also (nur) für ein Zeichen.
Dann schau ich mir mal strstream an!
Danke für die Hilfe!
-
strstream ist seit C++98 deprecated (veraltet)!. Benutze stringstream!