C++ test, ob die Eingabe eine double/char
Ich versuche, eine Eingabe von dem Nutzer und müssen wissen, eine Möglichkeit zu haben, den das Programm erkennt, dass die Eingabe war oder war nicht ein double/char, das ist, was ich jetzt haben... aber wenn Sie geben eine falsche Art der Eingabe
1) den Doppel-test einer nur loops infinatly
2) der char wird nicht aufhören, looping, auch mit den richtigen imput
int main () {
double _double = 0;
bool done = true;
while ( done ) {
cout << "Please enter a DOUBLE:\n" << endl;
cin >> _double;
if ( _double > 0 ) { done = false; }
if ( _double < 0 ) { cout << "\nthe number you entered was less than zero\nplease enter a valad number..." << endl; }
if(cin.fail()) { cin.clear(); }
}
done = false;
char _char = ' ';
while ( !done ) {
cout << "Please enter a CHAR" << "\n";
cout << "\t'y' = yes\n\t'n' = no" << endl;
cin >> _char;
if ( _char == 'y' || _char == 'n' ) { done = true; }
if ( ! (_char == 'y' || _char == 'n') ) { cout << "\nyou have entered an invald symbol... \n" << endl; }
if(cin.fail()) { cin.clear(); }
}
- Und es funktioniert nicht? Könnten Sie bitte angeben, Ausgabe -, und erwartete Ausgabe? Es wird Sie Antworten schneller.
- Jeder char Eingabe ist ein char, natürlich. Wie konnte der test möglicherweise fehl? Der code schlägt vor, Sie suchen nach einem bestimmten char, insbesondere entweder
'y'
oder'n'
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass, wenn Sie etwas Lesen und
cin
sieht die Eingabe kann nie ein double ist, hört es auf zu Lesen, verlassen Sie die Sachen in den Puffer, dass es nicht verbrauchen. Es wird ein Zeichen für eine Störung, die Sie klar, aber Sie nicht Essen die Verbleibende Eingabe, diecin
nicht Essen. Also, das nächste mal die gleichen falschen Eingabe zu Lesen versuchte wieder, und wieder...Das problem mit der
char
ist, dass Sie haben, um drücken Sie die return-Taste, um es zu verarbeiten-Zeichen auf den meisten terminals (dies geschieht nicht, wenn du dein Programm aus einer Datei Lesen, zum Beispiel). Also, wenn Sie drücken Siey
dann wird es nicht gehen aus der read aufrufen, bis Sie die Enter-Taste drücken. Aber dann wird es normalerweise gehen Sie und beenden Sie die Schleife.Wie andere erwähnt, Sie sind besser dran mit dem Lesen einer ganzen Zeile und dann entscheiden, was zu tun ist. Sie können auch überprüfen Sie die Nummer mit C++ - streams anstelle von C-Funktionen:
Liest sich das erste double-Zahl und dann alle verbleibenden Leerraum. Wenn es dann Treffer
eof
(Ende der Datei/stream), es bedeutet, der string enthält nur ein Doppel.Für den char haben, können Sie nur testen, für Länge 1
Wenn Sie möchten, Lesen Sie nur 1 char und fortsetzen, sobald der char eingegeben wurde, dann müssen Sie mit Plattform-abhängigen Funktionen (C++ nicht bieten Ihnen standard-Funktionen). Achten Sie auf die conio.h - Datei für windows zum Beispiel, die hat die
_getch
Funktion für diese. Auf unix-Systemen ncurses bietet eine solche Funktionalität.Die beste Wette ist immer zu Lesen, Ihre Eingaben als strings. Sie können dann mit Funktionen wie
std::strtod()
zu testen und umzubauen. Die überprüfung, ob streams fehlgeschlagen und dann zurücksetzen, Sie ist fehleranfällig, am besten, und nicht geben Ihnen die Möglichkeit, die Herstellung guter Fehlermeldungen.Beispiel:
Den Zeiger p auf das erste Zeichen, das nicht konvertiert werden kann zu einem Doppelbett. Wie genau Sie damit umgehen, dass hängt wirklich davon ab, die app-Logik.
cin >> _double
wird, erhalten Sie immer ein Doppelzimmer, ob Sie eingegeben "42", "0" oder "mary had a little lamb". Sie benötigen zum Lesen der Benutzereingabe als string, dann testen Sie die Zeichenfolge, um zu sehen, ob es ist eine doppelte. sscanf 0 zurück, wenn es nicht umwandeln kann den Eingabe-string, der den gewünschten Typ:Auch, Bezeichner mit führenden underscores wie haben Sie reserviert sind, die durch die Sprache. Don ' T get in die Gewohnheit der Namensgebung Dinge wie
_double
- irgendwann darf Sie nicht arbeiten.cin >> _double
:if(cin >> _double) done=true; else cout << "Not a number!" << endl;