Citrus-Motte Geschrieben 10. April 2002 Geschrieben 10. April 2002 Ich habe da ein Problem mit einer do-while-Schleife in der mit cin. getline eine Zeichenkette eingelesen und danach wieder ausgegeben wird. Und zwar wird ohne die unten ausgeklammerte If-Anweisung nur beim ersten Durchlauf cout << "Einen Namen eingeben: "; cin.getline(Person, 21); ausgeführt. Beim 2.-n. Mal erscheint erst "Weiter (j/n)? " wieder auf dem Bildschirm. Unten seht Ihr meinen, aufs Wesentliche zusammengestrichenen, Code.#include <iostream.h> #include <conio.h> //--------------------------------------- int main() { int i = 0; char Person[21], Puffer[80], Weiter; do { i++; /* if (i>1) { cin.getline(Puffer, 80); } */ clrscr(); cout << "Einen Namen eingeben: "; cin.getline(Person, 21); clrscr(); cout << Person; cout << endl << "Weiter (j/n)? "; cin >> Weiter; } while (Weiter == 'j'); return 0; }[/PHP]Mit dem if funktioniert es zwar, aber es wäre nett, wenn mir jemand erklärt wo das Problem liegt. Außerdem gibt es bestimmt noch eine elegantere Möglichkeit. Vielen Dank für Eure Mühe Zitieren
maxim_42 Geschrieben 11. April 2002 Geschrieben 11. April 2002 mir ist unklar was du mit dem pufffer bezweckst, aber abgesehen davon, kannst du dir i sparen indem du weiter mit 0 initialisierst, und statt if(i>1) if(weiter) schreibst. Ich glaub allerdings, dass ich nicht so ganz verstanden hab, was du genau erreichen willst. Zitieren
Citrus-Motte Geschrieben 11. April 2002 Autor Geschrieben 11. April 2002 Original geschrieben von maxim_42 mir ist unklar was du mit dem pufffer bezweckst, ... Ich glaub allerdings, dass ich nicht so ganz verstanden hab, was du genau erreichen willst. Hi maxim_42, was dieser "Puffer" bewirkt weiss ich leider selbst nicht genau. :confused: (Bzw. weiss ich schon welche Wirkung er hat, aber nicht warum) Es ist so, dass beim ersten Durchlauf der Schleife alles funktioniert wie ich es will. Ab dem zweiten Durchlauf aber die Namenseingabe nicht gefordert wird, sondern gleich gefragt wird, ob ich weitermachen will. Mit dem zusätzlichen cin.getline (das im if) wird dann auch die Namensfrage durchlaufen. Aber warum? Wie bewirkt es das? Zitieren
gajUli Geschrieben 11. April 2002 Geschrieben 11. April 2002 Koennte vielleicht wieder der alte Effekt sein, dass bei mehrfachen Konsoleneingaben etwas im Tastaturpuffer stehen bleibt, und dann damit die folgende Eingabe ueberrannt wird. Hatten wir schon oefter an der Stelle. Bau mal vor jeder Eingabe einen Flush ein, um das Problem auszuschliessen. Zitieren
Citrus-Motte Geschrieben 11. April 2002 Autor Geschrieben 11. April 2002 Original geschrieben von gaiusjUlius Koennte vielleicht wieder der alte Effekt sein, dass bei mehrfachen Konsoleneingaben etwas im Tastaturpuffer stehen bleibt, und dann damit die folgende Eingabe ueberrannt wird. Hatten wir schon oefter an der Stelle. Bau mal vor jeder Eingabe einen Flush ein, um das Problem auszuschliessen. Hallo Uli, ich habe Deinen Tip beherzigt und meinen Code folgendermaßen verändert:#include <iostream.h> #include <conio.h> #include <stdio.h> //--------------------------------------- int main() { char Person[21], Weiter; do { clrscr(); cout << "Einen Namen eingeben: "; fflush(stdin); cin.getline(Person, 21); clrscr(); cout << Person; cout << endl << "Weiter (j/n)? "; fflush(stdin); cin >> Weiter; } while (Weiter == 'j'); return 0; }[/PHP]Leider wird die "Namensfrage" auch dann nur beim 1.Mal gestellt. Irgendwas mache ich da wohl immernoch falsch. Zitieren
maxim_42 Geschrieben 11. April 2002 Geschrieben 11. April 2002 Der Grund ist wohl, dass cin.getline nicht blockiert. Im getline versucht was vom Stream zu lesen, und wenn es da nichts gibt kommt sie sofort zurück. Folgendes sollte laufen: #include <iostream> int main() { char Person[21], Weiter, c; do { std::cout << "Einen Namen eingeben: "; std::cin>>c;//cin blockiert bis zum Enter std::cin.putback(c);// c zurück auf den Stream std::cin.getline(Person, 21); std::cout << Person; std::cout << std::endl << "Weiter (j/n)? "; std::cin >> Weiter; } while (Weiter == 'j'); return 0; } Zitieren
Citrus-Motte Geschrieben 11. April 2002 Autor Geschrieben 11. April 2002 Hi maxim_42, danke, mit demcin>>c; cin.putback©; funktioniert es. Was mich nur wundert ist, dass es beim ersten Durchlauf auch ohne das funktioniert. Und wenn nach der Frage nach dem Namen auf die gleiche Weiseclrscr(); cout << "Einen Ort eingeben: "; cin.getline(Ort, 21); nach einem Ort gefragt wird (ohne Deine Lösung), wird die Frage nach dem Namen zwar ausgelassen, aber die Frage nach dem Ort kommt ganz normal. Zitieren
maxim_42 Geschrieben 11. April 2002 Geschrieben 11. April 2002 Ja, merkwürdig, ich bin auch nicht sicher ob, meine Vorstellung woran das liegt richtig war. Mit etwas Zeit ist es bestimmt interessant das Ganze mal zu debuggen. Dann hat man die entscheidenden Größen im Blick und kann sehen was passiert. Schon probiert? Zitieren
Citrus-Motte Geschrieben 11. April 2002 Autor Geschrieben 11. April 2002 @ maxim_42 Hab' ich jetzt mal gemacht. Also, beim zweiten Durchlauf wurde bei cin.getline(Person, 21) ein /0 in Person geschrieben ohne das man was machen konnte. Mit dem cin>>c; cin.putback© wird beim zweiten Durchlauf in c aber der erste Buchstabe der Eingabe (z.B. W) und in Person die gesamte Eingabe (z.B. Werner) geschrieben. Zitieren
maxim_42 Geschrieben 12. April 2002 Geschrieben 12. April 2002 Das Ganze ist einigermaßen rätselhaft. Die eleganteste Lösung ist wahrscheinlich nach std::cin>>weiter die Anweisung std::cin.ignore(); einzufügen. Damit wird das nächste Zeichen auf dem istream ignoriert. Zitieren
Citrus-Motte Geschrieben 12. April 2002 Autor Geschrieben 12. April 2002 @ maxim_42: da bin ich froh, dass ich nicht die Einzige bin, die sich wundert. Ich dachte schon, ich würde mich irgendwie nur blöd anstellen. Das cin.ignore(); finde ich auch ganz elegant und es funktioniert prima. Danke! Zitieren
Woodstock Geschrieben 12. April 2002 Geschrieben 12. April 2002 Hallo Citrus! Hmm, also wundern musst Du Dich nicht. cin.getline und cin sind nicht miteinandern verknüft, so das wenn Du mit cin.getline() etwas einließt, es dann ausgiebts, und dann mit cin etwas einließt, das dann das '\n' noch im Puffer liegt. Deshalb kalppt das dann auch wenn Du ein cin.ignor() dazwischen setzt, weil das Zeichen dann aus dem Puffer geleert wird. Bine Zitieren
Citrus-Motte Geschrieben 12. April 2002 Autor Geschrieben 12. April 2002 Hallo Bine! Danke für die Aufklärung. Ich finde es immer gut, wenn ich nicht nur weiss wie ich etwas lösen kann, sondern auch warum es überhaupt auftrat. Nach dem debuggen hatte ich mir schon sowas gedacht und bin froh, dass ich mit meiner Ahnung recht hatte. Zitieren
nic_power Geschrieben 12. April 2002 Geschrieben 12. April 2002 Hallo, Du hast "Weiter" als "char" deklariert! Bei cin >> Weiter gibts Du aber in Wirklichkeit zwei (!) Charakter an, naemlich einem "j" oder "n" und ein zusaetzliches return, welches immer noch im Puffer steht und bei zweiten Schleifendurchlauf vom "getline" eingelesen wird. Liess einfach einen kleinen String ein und werte bloss den ersten Buchstaben aus. Nic Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.