Sonntag, Dezember 15, 2019

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'.
InformationsquelleAutor Wallter | 2010-01-14

3 Kommentare

  1. 3

    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, die cin 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 Sie y 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:

    bool checkForDouble(std::string const& s) {
      std::istringstream ss(s);
      double d;
      return (ss >> d) && (ss >> std::ws).eof();
    }

    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.

    std::string line;
    while(!getline(std::cin, line) || !checkForDouble(line)) 
      std::cout << "Please enter a double instead" << std::endl;

    Für den char haben, können Sie nur testen, für Länge 1

    std::string line;
    while(!getline(std::cin, line) || line.size() != 1) 
      std::cout << "Please enter a double instead" << std::endl;

    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.

    • WOW „Johannes Schaub – litb‘, ich danke Ihnen so sehr! Sie haben keine Ahnung, wie viel Zeit du hast mich gerettet. danke!!!
  2. 5

    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:

    string s;
    cin >> s;
    char * p;
    double d = strtod( s.c_str(), & p );
    if ( * p == 0 ) {
       cout << "Read double: " << d << endl;
    }
    else {
       cout << "Read string: " << s << endl;
    }

    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.

    • bekomme ich ein code-snippet ein Beispiel dafür?
  3. 2

    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:

    cout << "Please enter a DOUBLE:\n" << endl;
        string s;
    cin >> s;
        if( !sscanf(s.c_str(), "%lf", &_double) )
        {
            done = false;
            cout << "Not a number, sparky. Try again." << endl;
            continue;
        }

    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.

    • haha ja das ‚ _ ‚ – war nur ein mehr prägnantes Beispiel für die Quelle
    • ich muss noch wissen, wie um zu testen, für einen CHAR zu…
    • Eigentlich kann man das Ergebnis testen von cin >> _double: if(cin >> _double) done=true; else cout << "Not a number!" << endl;
    • Der Formatbezeichner ist falsch, es muss „%lf“. Mit „%f“ stopft ein Schwimmer in einem Doppelzimmer. Dies ist ein bisschen wie das schlechteste von beiden.
    • Ganz Recht, Feste post

Kostenlose Online-Tests

Ihre Entwicklerrolle