web-dev-qa-db-de.com

Wenn Sie den cin-Eingabestrom überprüfen, wird eine ganze Zahl erzeugt

Ich habe dies eingegeben und der Benutzer wird aufgefordert, zwei Ganzzahlen einzugeben, die dann zu Variablen werden. Von dort werden einfache Operationen ausgeführt. 

Wie kann ich den Computer dazu bringen, zu prüfen, ob eine Ganzzahl eingegeben wurde oder nicht? Wenn dies nicht der Fall ist, bitten Sie den Benutzer, eine Ganzzahl einzugeben. Beispiel: Wenn jemand "a" anstelle von 2 eingibt, wird er aufgefordert, eine Zahl erneut einzugeben.

Vielen Dank

 #include <iostream>
using namespace std;

int main ()
{

    int firstvariable;
    int secondvariable;
    float float1;
    float float2;

    cout << "Please enter two integers and then press Enter:" << endl;
    cin >> firstvariable;
    cin >> secondvariable;

    cout << "Time for some simple mathematical operations:\n" << endl;

    cout << "The sum:\n " << firstvariable << "+" << secondvariable 
        <<"="<< firstvariable + secondvariable << "\n " << endl;

}
12
user2766546

Sie können dies überprüfen:

int x;
cin >> x;

if (cin.fail()) {
    //Not an int.
}

Darüber hinaus können Sie weiterhin Eingaben erhalten, bis Sie ein Int erhalten über:

#include <iostream>



int main() {

    int x;
    std::cin >> x;
    while(std::cin.fail()) {
        std::cout << "Error" << std::endl;
        std::cin.clear();
        std::cin.ignore(256,'\n');
        std::cin >> x;
    }
    std::cout << x << std::endl;

    return 0;
}

BEARBEITEN: Um den folgenden Kommentar bezüglich der Eingabe wie 10abc zu behandeln, könnte man die Schleife so ändern, dass eine Zeichenfolge als Eingabe akzeptiert wird. Überprüfen Sie dann die Zeichenfolge auf ein beliebiges Zeichen, keine Zahl, und behandeln Sie diese Situation entsprechend. In dieser Situation muss der Eingangsstrom nicht gelöscht/ignoriert werden. Wenn Sie überprüfen, ob die Zeichenfolge nur aus Zahlen besteht, konvertieren Sie die Zeichenfolge zurück in eine Ganzzahl. Ich meine, das war gerade aus der Manschette. Es könnte einen besseren Weg geben. Dies funktioniert nicht, wenn Sie Floats/Doubles akzeptieren (muss '.' In die Suchzeichenfolge einfügen).

#include <iostream>
#include <string>

int main() {

    std::string theInput;
    int inputAsInt;

    std::getline(std::cin, theInput);

    while(std::cin.fail() || std::cin.eof() || theInput.find_first_not_of("0123456789") != std::string::npos) {

        std::cout << "Error" << std::endl;

        if( theInput.find_first_not_of("0123456789") == std::string::npos) {
            std::cin.clear();
            std::cin.ignore(256,'\n');
        }

        std::getline(std::cin, theInput);
    }

    std::string::size_type st;
    inputAsInt = std::stoi(theInput,&st);
    std::cout << inputAsInt << std::endl;
    return 0;
}
24
Chemistpp

In c gibt es eine Funktion namens isdigit(). Das wird dir gut passen. Beispiel:

int var1 = 'h';
int var2 = '2';

if( isdigit(var1) )
{
   printf("var1 = |%c| is a digit\n", var1 );
}
else
{
   printf("var1 = |%c| is not a digit\n", var1 );
}
if( isdigit(var2) )
{
  printf("var2 = |%c| is a digit\n", var2 );
}
else
{
   printf("var2 = |%c| is not a digit\n", var2 );
}

Ab hier

1
nook

Wenn das Einfügen von Istream fehlschlägt, wird das Fail-Bit gesetzt.

int i = 0;
std::cin >> i; // type a and press enter
if (std::cin.fail())
{
    std::cout << "I failed, try again ..." << std::endl
    std::cin.clear(); // reset the failed state
}

Sie können dies in einer do-while-Schleife einrichten, um den korrekten Typ (int) in diesem Fall eingefügt zu bekommen.

Weitere Informationen: http://augustcouncil.com/~tgibson/tutorial/iotips.html#directly

1
Zac Howland

Heh, das ist eine alte Frage, die eine bessere Antwort gebrauchen könnte.

Benutzereingaben sollten als string und dann versuchskonvertiert auf den gewünschten Datentyp abgerufen werden. Praktischerweise können Sie damit auch Fragen beantworten wie: "Welche Art von Daten sind meine Eingaben?"

Hier ist eine Funktion, die ich häufig benutze. Es gibt andere Optionen, z. B. in Boost, aber die Grundvoraussetzung ist die gleiche: Versuchen Sie, die Umwandlung von Zeichenfolge → Typ durchzuführen und den Erfolg oder Misserfolg zu beobachten:

template <typename T>
std::optional <T> string_to( const std::string& s )
{
  std::istringstream ss( s );
  T result;
  ss >> result >> std::ws;      // attempt the conversion
  if (ss.eof()) return result;  // success
  return {};                    // failure
}

Die Verwendung des Typs optional ist nur eine Möglichkeit. Sie können auch eine Ausnahme auslösen oder bei einem Fehler einen Standardwert zurückgeben. Was auch immer für Ihre Situation funktioniert.

Hier ist ein Beispiel für die Verwendung:

int n;
std::cout << "n? ";
{
  std::string s;
  getline( std::cin, s );
  auto x = string_to <int> ( s );
  if (!x) return complain();
  n = *x;
}
std::cout << "Multiply that by seven to get " << (7 * n) << ".\n";

Einschränkungen und Typenidentifikation

Damit dies funktioniert, muss natürlich eine Methode vorhanden sein, um Ihren Datentyp eindeutig aus einem Stream zu extrahieren. Dies ist die natürliche Reihenfolge der Dinge in C++ - das heißt, Business as usual. Also keine Überraschungen hier.

Der nächste Nachteil ist, dass einige Typen andere subsumieren. Wenn Sie beispielsweise versuchen, zwischen int und double zu unterscheiden, prüfen Sie zuerst, ob int vorhanden ist, da alles, das in eine int konvertiert, ebenfalls eine double ist.

1
Dúthomhas

Sie können den Variablennamen selbst verwenden, um zu prüfen, ob ein Wert eine Ganzzahl ist. Beispiel:

#include <iostream>
using namespace std;

int main (){

int firstvariable;
int secondvariable;
float float1;
float float2;

cout << "Please enter two integers and then press Enter:" << endl;
cin >> firstvariable;
cin >> secondvariable;

if(firstvariable && secondvariable){
    cout << "Time for some simple mathematical operations:\n" << endl;

    cout << "The sum:\n " << firstvariable << "+" << secondvariable 
    <<"="<< firstvariable + secondvariable << "\n " << endl;
}else{
    cout << "\n[ERROR\tINVALID INPUT]\n"; 
    return 1; 
} 
return 0;    
}
0
user6090272