cin.Holen Sie sich in eine while-Schleife
Ich versuche, eine Eingabe von Benutzer und geben Ausgang, bis er/Sie Pressen 'n'. Es scheint nicht zu funktionieren. Ist das problem in scanf oder cin.bekommen? Wenn ich drücken Sie y, es dauert nur "tekrar" als Eingabe, so gibt "y" als Ausgang und geht in eine Schleife. Auch nicht aufhören, wenn ich geben Sie n als tekrar Eingang.
char cevap[300]="";
char tekrar='y';
while (tekrar!='n')
{
cin.get(cevap,300);
cout<<cevap<<endl;
cout<<"Again? (y/n)";
scanf("%c",&tekrar);
}
Ausgabe:
Hello
Again? (y/n)
y
Again? (y/n)
y
Again? (y/n)
n
Again? (y/n)
n
...
- wenn Sie einen debugger anfügen, Sie sollten in der Lage sein, um den Inhalt der
cevap
undtekrar
. Oder Sie können fügen Sie einfach eine cout-Anweisung, so können Sie ganz einfach die Werte angezeigt, während das Programm läuft. Das wird Ihnen sagen, wenn cevap oder tekrar ist nicht korrekt aktualisiert. - mixing << und scanf kann auch Probleme verursachen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mischen der verschiedenen Eingabe-Methoden auf
istream
(get
,getline
,operator>>
) kann voller Gefahr, wenn Sie nicht wissen, welche Methoden lassen sich die Trennzeichen in den Strom und welche nicht, und behandeln Sie entsprechend.In diesem Fall
get
liest 300 Zeichen aus input-oder input bis zum Zeilenende ein, je nachdem, was zuerst Eintritt. Der Zeilenumbruch wird nicht extrahiert werden, und so wird es auch bleiben, in den Bach. Das bedeutet, dass dein Aufrufscanf()
Lesen Sie die neue Zeile und stoppen, so dass diey
odern
den Sie gerade eingegeben haben in den stream.Gibt es mehrere Möglichkeiten, sich zu reorganisieren dieser code, um es zu tun, was es scheint, wie Sie wollen. Dies ist eine Möglichkeit:
Diese verwendet
std::string
- und non-membergetline
zu Lesen Sie input in einer Weise, um nicht von Ihnen verlangen, begrenzt auf 300 Zeichen (streng genommen nicht mit der Frage, aber gute Praxis in der Regel).getline
verbraucht und verwirft die Trennzeichen, aberget
, verwendet, um die Fortsetzung Lesen-Eingang, nicht, so verwerfen wir es manuell überignore
.cin.get()
für Demonstrationszwecke, denn es scheint mir, dass mitstd::getline(cin, tekrar)
würde genauso gut funktionieren, in diesem Fall (vorausgesetzttekrar
geändert wurden, um einestd::string
).Verwenden cin operator>> von stdin Lesen, anstelle von scanf:
Edit: behoben, die unendliche Schleife. Sie sollten die Verwendung von std::string statt ein einfaches char-array.