PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : switch - getline - verwirrung



Burger
14-07-2002, 23:09
Hi,

also, wenn ich folgendes mache, dann geht es:

string name;
cout << "Gebe Deinen Namen ein:\t";
getline(cin, name);

peppe ich das Gleiche in ein switch-Statement, dann übergeht er das getline einfach !!!

string name;
int choice;

switch(choice)
{
case(1):
getline(cin, name);
break;

case(2):
.
.
.
}

Okay, ist nur ein Code-Schnipsel, aber dürfte klar sein, oder? er breakt also schon bevor er "getline" ausführt. Verwende ich "cin >> name;" funktioniert es, aber dann kann ich nur ein Wort einlesen.
Auch ein std::getline(cin, name) hat nichts genützt, wenn das denn überhaupt eine sinnvolle Idee war. Naja, jedenfalls bin ich verwirrt...

Bis denn

Burger

tkortkamp
15-07-2002, 00:51
Warum hast du Klammern um 1 und 2?
Das darfst nicht machen. Ohne Klammern funktioniert das (habs überprüft). Also:


string name;
int choice;
cin >> choice;

switch(choice)
{
case 1:
getline(cin, name);
break;

case 2:
.
.
.
}


c ya,
Tobias

Burger
15-07-2002, 01:53
Hi,

danke schon mal für die Antwort, also es das er richtig "switched" ist nicht das eigentliche Problem. Er springt schon zu "case 1" (Sheint sowohl mit als auch ohne Klammer zu funktionieren - ich hatte das mit den Klammern aus einem Buch...).

Bei mir wird dann eine Funktion aufgerufen, die erst einen Text ausgibt und dann nach einer Eingabe fragt. Der Text wird ausgegeben, aber das getline übersprungen. Hier mal der orginal-Code ( sorry, dass ich es vorher etwas verkürzt hatte... )

//Das Switch-Statement:

switch( choice )
{
case 1:
Held.setName(nameHero());
break;


case(2):
Held.show();
break;
}


//Und die Funktion nameHero()

string nameHero()
{
string name;

cout << "Gebe einen Namen ein:\t";
getline(cin, name);
return name;
}

In dieser Konstellation wird wie gesagt der Text ausgeworfen, aber getline nicht ausgeführt... Nehme ich in der Funktion statt "getline" "cin >> name;", dann wartet er auf eine Eingabe... Und das ist's, was ich nicht so ganz verstehe... Übrigens: Rufe ich die Funktion außerhalb des switch-Statements auf also

int main()
{
Held.setName( nameHero() );
}

wird alles wie gewünscht abgearbeitet - Pling - und da hakt's dann bei mir aus... wie gesagt, etwas verwirrt.

Bis denne,

Burger

muchmarc
15-07-2002, 06:09
Hi,
für mich sieht es so aus, als wenn
dein Eingabepuffer noch gefüllt ist, d.h.
die Eingabe zur Switch-Anweisung auch
als Eingabe für Getline genommen wird.
Du kannst ja mal per printf-debugging
die Eingabe von Getline ausgeben lassen.
Ist sie wie die switch-bedingung dann
hatte ich recht *g*. Falls ich recht
hatte, schreib mal vor dem neuen
Einlesen ein
fflush (stdin); //löscht Eingabepuffer

mfg
muchmarc

P.S.
Hiermit begrüße ich als neues
Mitglied alle alten Hasen...

Burger
16-07-2002, 00:59
Hi,

ja, das klingt sehr logisch - würde auch noch ein anderes Problem erklären, das in diesem Zusammenhang auftaucht. Allerdings bin ich ziemlich frisch bei C++ und deshalb dauert es wahrscheinlich ein Weilchen, bis ich die Tipps umgesetzt habe,

denn im Moment liefert er mir bei

fflush(stdin);

die Meldung er würde "stdin" nicht kennen. Muss mich daher noch mit fflush beschäftigen - muss ich da eine bestimmte Header-Datei einbinden (iostream ist schon drin)?

Und wie das mit dem printf-debugging funktioniert muss ich auch noch austüfteln, wenn's Neuigkeiten gibt, dann melde ich mich wieder, wollte nur schon mal kurz reagieren...

Bis denn,

Burger

tkortkamp
16-07-2002, 01:00
man 3 stdin

c ya

Burger
22-07-2002, 05:00
Moin,

also, Tipp eins gecheckt. Nachdem ich die entsprechende Headerdatei eingebunden hatte, tat's auch fflush(stdin). Allerdings erscheint das Problem weiterhin. Jetzt fummele ich noch am printf-debugging rum. Ich tippe mal darauf, das "printf" die debugger-Infos in eine Datei schreibt, oder?

Gebt mir noch zwei oder drei Tage und ich habe ausgetüftelt wie ich das anstelle, sollte ich's nicht schaffen, melde ich mich wieder.

So long,

Burger

muchmarc
22-07-2002, 08:22
nee, so meinte ich das nicht mit
printf-debugging!
printf-debugging ist einfach die
Ausgabe der Variablen im Programm
bevor und nachdem du sie modifizert
hast.
Ist z.B. der Wert nach dem Einlesen
immer noch der gleiche wie vor dem
Einlesen, dann könnte man daraus
schlußfolgern, das das Schreiben in
die Vari fehlschlug.
Ist nicht die feine engl. Art, aber
bei kleinen Programmen /Abschnitten
ist es manchmal nützlich.
(Man könnte es ja gleich beim progr.
Einbringen und wenn das Prog fertig
ist löschen / auskommentieren)

mfg
muchmarc

Burger
22-07-2002, 18:46
Hi,

ah so... das ist natürlich 'ne ziemlich gute Methode... werde ich gleich heute mal probieren.

Bis denn,

Burger

Burger
25-07-2002, 11:16
Hi,

jetzt läufts. Habe noch einen Tipp von einem Bekannten bekommen. Nachdem ich hinter der Eingabeaufforderung für die Wahl bezüglich des Switch-Statements noch ein "cin.ignore();" eingefügt habe gibt's keine Probleme mehr.

Offensichtlich befindet sich das "\n" noch im Puffer, darauf wird aber ja bei getline(cin, name); gerade gewartet. cin.ignore(); sorgt wohl dafür, dass das "\n" gar nicht erst im Puffer landet.

Der Teil sieht dann so aus:

cin >> choice;
cin.ignore();

Bis denne,

Burger