Wie erstell ich eine Bedingung bei der die Eingabe eine Zahl sein muss?



  • Hey Leute,

    Die Frage steht bereits oben.

    Und zwar möchte ich das eine Zahl eingegeben wird und wenn ein Buchstabe eingegeben wird dann soll etwas anderes geschehen:

    cin >> Eingabe;

    getchar ();

    if (Eingabe= _____)

    { ... }

    else

    {...}

    Bei dem Unterstrich soll die Bedingung eingeführt werden
    dass eine Ganzzahlige Zahl eingegeben werden muss



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • #include <cctype>
    #include <iostream>
    #include <string>
    
    int main()
    {
        //einlesen
        std::string input;
        std::cin >> input;
    
        bool is_digit = true; // anfangs: ganzahl
        for (auto c : input) // jedes zeichen in input checken
            if (!std::isdigit(c)) // sobald die erste nicht-Zahl auftaucht...
            {
                is_digit = false; // als zeichen kennzeichnen
                break; // schleife verlassen
            }
    
        if (is_digit) // wenn zahl
            std::cout << "zahl";
        else // keine zahl
            std::cout << "zeichen";
    }
    


  • $ ./a.out
    -123
    zeichen
    

    Ups.

    Die einfachste Methode ist wohl

    #include <iostream>
    #include <limits>
    #include <string>
    
    ...
    
    int x; // bzw. double x;
    
    if(std::cin >> x) {
      // Zahl
    } else {
      std::string s;
    
      std::cin.clear();
      std::cin >> s;
    
      std::cerr << s << " ist keine Zahl.\n";
    }
    
    // Wenn zeilenbasierte Eingabe gewollt ist: Rest der Zeile verwerfen.
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    Für zeilenweise Eingabe auch möglich:

    #include <iostream>
    #include <sstream>
    #include <string>
    
    ...
    
    std::string line;
    int x;
    
    std::getline(std::cin, line);
    
    if(std::istringstream(line) >> x) {
      // Zahl
    } else {
      // line ist keine Zahl.
    }
    


  • Na ja, bei deinen Lösungen werden Eingaben wie 123abc als zahl eingestuft und abc muss gelöscht werden.
    Wenn der TE will, dass 123abc als Zeichen eingestuft wird, ist meine Lösung besser.



  • seldon schrieb:

    if(std::istringstream(line) >> x) {
    

    Das hier geht aber erst seit C++11, oder?



  • Ich glaube schon.
    Meine Lösung braucht aber auch C++11.



  • out schrieb:

    Das hier geht aber erst seit C++11, oder?

    Nein, wieso?



  • Nexus schrieb:

    out schrieb:

    Das hier geht aber erst seit C++11, oder?

    Nein, wieso?

    Hier wird doch ein temopräres Objekt erzeugt und operator>> nimmt doch nicht const-ref entgegegen?



  • Oder ganz simpel:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        string eingabe;
        cin >> eingabe;
        if(eingabe.find_first_not_of("0123456789" == string::npos)
            cout << "Zahl !\n";
        else
            cout << "Etwas Anderes !\n";
    }
    


  • Ethon schrieb:

    Oder ganz simpel:

    [code="cpp"]#include <iostream>
    #include <string>
    using namespace std;

    int main()
    {
    string eingabe;
    cin >> eingabe;
    if(eingabe.find_first_not_of("0123456789") == string::npos)
    cout << "Zahl !\n";
    else
    cout << "Etwas Anderes !\n";
    }[/code]

    👍
    Stimmt, std::string hat ja so tolle Suchfunktionen.



  • out schrieb:

    Hier wird doch ein temopräres Objekt erzeugt und operator>> nimmt doch nicht const-ref entgegegen?

    Nein, die int -Überladung von operator>> ist ein Member von std::istringstream . Sowas ging schon mit C++98, sah man teilweise auch bei Copy-and-Swap:

    MyClass(origin).swap(*this);
    

    std::istringstream(...) >> myString wäre aber erst mit C++11 möglich, weil dieser operator>> eine freie Funktion ist.



  • Nexus schrieb:

    out schrieb:

    Hier wird doch ein temopräres Objekt erzeugt und operator>> nimmt doch nicht const-ref entgegegen?

    Nein, die int -Überladung von operator>> ist ein Member von std::istringstream . Sowas ging schon mit C++98, sah man teilweise auch bei Copy-and-Swap:

    MyClass(origin).swap(*this);
    

    Grad als du es geschrieben hast, habs ichs auch gesehen. Hier wird ja istream::operator>>(int&) aufgerufen... klar dann gehts. 🙂

    Nexus schrieb:

    std::istringstream(...) >> myString wäre aber erst mit C++11 möglich, weil dieser operator>> eine freie Funktion ist.

    Stimmt.

    Danke dir 🙂


Anmelden zum Antworten