Wie man Cin dazu bringt, nur Zahlen zu nehmen

Lesezeit: 4 Minuten

Wie man Cin dazu bringt nur Zahlen zu nehmen
Benutzer1426900

Hier ist der Code

double enter_number()
{
  double number;
  while(1)
  {

        cin>>number;
        if(cin.fail())
        {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Invalid input " << endl;
        }
        else
        break;
        cout<<"Try again"<<endl;
  }
  return number;
}

Mein Problem ist, dass, wenn ich so etwas wie 1x eingebe, dann 1 als Eingabe genommen wird, ohne das Zeichen zu bemerken, das für einen weiteren Lauf ausgelassen wird. Gibt es eine Möglichkeit, es mit einer reellen Zahl, zB 1,8, zum Laufen zu bringen?

  • Alles in einen String einlesen und die Eingabe entsprechend parsen?

    – Rhexis

    31. Mai 2012 um 7:09 Uhr

  • cin.get() verwenden und dann auf EOF-Zeichen prüfen?

    – Ansar

    31. Mai 2012 um 7:18 Uhr

Wenn cin auf eine Eingabe trifft, die es nicht richtig in die angegebene Variable einlesen kann (z. B. die Eingabe eines Zeichens in eine Integer-Variable), geht es in einen Fehlerzustand und lässt die Eingabe in seinem Puffer.

Sie müssen mehrere Dinge tun, um dieses Szenario richtig zu handhaben.

  1. Sie müssen diesen Fehlerzustand testen.
  2. Sie müssen den Fehlerstatus löschen.
  3. Sie müssen entweder die Eingabedaten behandeln, die den Fehlerzustand generiert haben, oder sie löschen und den Benutzer erneut auffordern.

Der folgende Code stellt eine von zahlreichen Methoden bereit, um diese drei Dinge zu tun.

#include<iostream>
#include<limits>
using namespace std;
int main()
{

    cout << "Enter an int: ";
    int x = 0;
    while(!(cin >> x)){
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid input.  Try again: ";
    }
    cout << "You enterd: " << x << endl;        
}

Sie könnten einfach einen großen Wert wie 1000 an cin.ignore übergeben, und es verhält sich wahrscheinlich für alle praktischen Zwecke genau gleich.

Sie können cin auch nach dem Eingabeversuch testen und so behandeln, etwa if(!cin){//clean up the error} .

Sehen Sie sich die istream-Referenz für andere Member-Funktionen an, um den Stream-Status zu verarbeiten: http://cplusplus.com/reference/iostream/istream/

  • @Jeff Ja, es leert den Puffer. Sie können es auch verwenden, wenn Sie cin mit getline verwenden, während Sie Eingaben vornehmen, da cin das ‘\n’ im Puffer belässt und nicht löscht (ich glaube, nicht ganz sicher, vielleicht war es cin.get), also wird getline nur mit Trennzeichen versehen in dem Moment, in dem es an den Eingabepuffer angehängt wird, wenn es auf das übrig gebliebene ‘\n’ trifft.

    – Alpha-Mineron

    29. September 2017 um 8:01 Uhr

  • Eine Sache, die dies nicht stoppt, ist, wenn ein Benutzer etwas wie eingibt 5a. Damit erkennen Sie den Fehler erst, wenn Sie das nächste Mal versuchen, Eingaben zu erhalten.

    – NathanOliver

    7. August 2019 um 12:47 Uhr

Wie man Cin dazu bringt nur Zahlen zu nehmen
Jess Gut

ich würde … benutzen std::getline und std::string die ganze Zeile zu lesen und erst dann aus der Schleife auszubrechen, wenn Sie die ganze Zeile in ein Double umwandeln können.

#include <string>
#include <sstream>

int main()
{
    std::string line;
    double d;
    while (std::getline(std::cin, line))
    {
        std::stringstream ss(line);
        if (ss >> d)
        {
            if (ss.eof())
            {   // Success
                break;
            }
        }
        std::cout << "Error!" << std::endl;
    }
    std::cout << "Finally: " << d << std::endl;
}

#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int get_int(void);
int main()
{
    puts("Enter a number");
    cout<<"The integer is "<<get_int()<<endl;
    return 0;
}
int get_int(void)
{
    char str[20];
    char* end;
    int num;
    do{
        fgets(str,20,stdin);
        str[strlen(str)-1]='\0';
        num=strtol(str,&end,10);
        if(!(*end))
            return num;
        else
        {
            puts("Please enter a valid integer");
            num=0;
        }
    }while(num==0);
}

Dies funktioniert gut für jede ganze Zahl. Es kann sogar prüfen, ob Sie nach der Ganzzahl ein Leerzeichen oder ein anderes Zeichen eingeben. Das einzige Problem ist, dass es nicht verwendet wird std::cin. Aber das Problem mit std::cin ist, dass es jedes Leerzeichen nach der Ganzzahl ignoriert und die Ganzzahl gerne als Eingabe nimmt.

  • Dieser Code ist wirklich schlecht. Es mischt C und C++ ohne guten Grund, legt eine fest codierte Zeilenbegrenzung fest, die Zeile, die ein Null-Terminator hinzufügt, funktioniert nicht richtig mit Multi-Byte-Zeilenumbrüchen und kann nicht zur Eingabe von 0 verwendet werden.

    – Sneftel

    20. September 2020 um 6:00 Uhr

  • über das Mischen von C und C++, strtol() existiert in C++.

    – Usama Ayub

    21. September 2020 um 10:38 Uhr

  • und es kann verwendet werden, um 0 einzugeben. Sie müssen es nicht versucht haben.

    – Usama Ayub

    21. September 2020 um 10:39 Uhr

  • über str[strlen(str)-1]=’\0′; Ich brauchte es, weil str sonst das Zeilenumbruchzeichen als letztes Zeichen enthalten würde und der Code nicht funktionieren würde. Wenn Sie glauben, dass Sie es besser machen können, geben Sie bitte eine bessere Lösung an.

    – Usama Ayub

    21. September 2020 um 10:46 Uhr


993090cookie-checkWie man Cin dazu bringt, nur Zahlen zu nehmen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy