Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben
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?

Geschrieben

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.

Geschrieben
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.

Geschrieben

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;

}

Geschrieben

Hi maxim_42,

danke, mit dem

cin>>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 Weise

clrscr();

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.

Geschrieben

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?

Geschrieben

@ 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.

Geschrieben

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.

Geschrieben

@ 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!

Geschrieben

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

Geschrieben

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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...