Zum Inhalt springen

c++: do-while mit cin.getline


Citrus-Motte

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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