2016-07-21 9 views
1

Ich versuche, das Programm zu erhalten, nur X als Ganzzahl zu akzeptieren, und dann nach einer anderen Ganzzahl y zu fragen. Wenn ich jedoch einen Fließkommawert in x eintrage, nimmt er den Dezimalteil der Eingabe und macht diesen zum y-Wert. Ich bin mir meines Fehlers hier nicht sicher.C++ - Benutzer gibt Gleitkomma statt Integer ein

#include <iostream> 
#include <string> 
#include <limits> 
using namespace std; 

int getInt() 
{ 
    int x = 0; 
    while (!(cin >> x)) 
    { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "Please input a proper 'whole' number: " << endl; 
    } 
    return (x); 
} 

int toobig() 
{ 
    cout << "Your number is too large, please enter something smaller: " << endl; 
    int x = getInt(); 
    return (x); 
} 

int toosmall() 
{ 
    cout << "your number is negative, please enter a positive number: " << endl; 
    int x = getInt(); 
    return (x); 
} 


int main() 
{ 

    cout << "your number please:-" << endl; 
    int x = getInt(); 

    if (x>100000) 
    { 
     toobig(); 
    } 
    else if (x<0) 
    { 
     toosmall(); 
    } 

    int y = 0; 

    cout << "enter y " << endl; 
    cin >> y; 

    cout << "x = " << x << endl; 
    cout << "y = " << y << endl; 
    system("PAUSE"); 

    return 0; 
} 
+0

Was meinen Sie mit dem "Y" -Wert? Wenn Sie "123.456" eingeben und es als Ganzzahl lesen, wird die 123 als Integer gelesen. – user3344003

+0

Vielleicht können Sie überprüfen, ob der Benutzer '. 'Nach der ersten Ganzzahl eingibt und in diesem Fall einen Fehler zurückgibt. – KABoissonneault

+0

ja x wäre 123, aber nachdem dies eingegeben wurde, druckt das Programm sofort X = 123 Y = 0. –

Antwort

0

da jeder Konsole Eingang C++ als String behandelt wird, dann unter dem getInt() -Methode ich folgendes tun würde:

 int GetInt(istream &stream) 
     { 
     char obtainChar; //read a character from input 
     int x;  

     stream >> x; 

     while(stream.fail() || (stream.peek() != '\r' && stream.peek() != '\n')) 
     { 
      stream.clear(); //clear the fail state of stream 
      obtainChar = stream.get(); //read a character from input 

      while(obtainChar != '\n' && obtainChar != EOF) //while gotten char is not a return key or EOF 
       obtainChar = stream.get(); //read a character from input iterate up to '\n' or EOF 
      //displays an error message if there was a bad input (e.g. decimal value) 
      cerr << endl << "Please input a proper 'whole' number: " << endl; 
      cout << endl << "Please re-enter x: "; //re-prompt to re-enter a value 

      x = GetInt(stream); //Try again by calling the function again (recursion) 
     } 
      return x; //will return after the user enters ONLY if an integer was inputted 
    } 

die erste, während im Grunde sagen, wenn der Strom (Konsoleneingabe) schlägt fehl oder der nächste Stream-Zeichensatz (.peek()) ist kein \ r oder a \ n, der den Stream löscht und das erste Zeichen erhält.

während das char ist nicht ein \ n und nicht das Ende der Datei (EOF) dann das nächste Zeichen erhalten, so weiter und so fort.

Wenn ein Problem auftrat, wird dem Benutzer eine Fehlermeldung angezeigt und der Benutzer erneut nach dem Wert von x gefragt.

Dann rufen Sie dieselbe Funktion auf, um die Eingabe (rekursiv) erneut zu testen, wenn alles gut ist, dann geben Sie den Wert von x zurück.

können Sie nun diese Funktion aufrufen, den Wert von Y.

Hinweis bewerten: im Grunde cin ist

HINWEIS istream ist Teil der iostream-Bibliothek: rufen Sie die Funktion wie folgt:

int x; 
cout << "your number please:-" << endl; 
x = GetInt(cin); 
1

Die meisten Konvertierungen zu int stoppen, sobald sie etwas finden, das nicht Teil einer int sein kann und nur einige Konvertierungsfunktionen sagen Ihnen, ob sie vor der Analyse der gesamten Zeichenfolge stoppen.

Lassen Sie uns one of those few verwenden, sollen wir?

int getInt() 
{ 
    for (; ;) // loop until user provides something we can use. 
       // This is dangerous. You probably want to give up after a while. 
    { 
     std::string input; // read in as string 
     if (std::cin >> input) 
     { 
      char * endp; // will be updated with pointer to where conversion stopped 
      errno = 0; 

      // convert string to int 
      long rval = std::strtol (input.c_str(), &endp, 10); 
      if (*endp == '\0') // check whole string was read 
      { 
       if (errno != ERANGE) // check converted number did not overflow long 
       { 
        if (rval >= std::numeric_limits<int>::min() && 
         rval <= std::numeric_limits<int>::max()) 
         // check converted number did not overflow int 
         // you could replace this min and max with your own passed-in 
         // min and max values if you want 
        { 
         return rval; // return the known-to-be-good int 
        } 
       } 
      } 
     } 
     else 
     { // note: usually when cin fails to read a string, it's over. 
      // This is actually a good time to throw an exception because this 
      // just shouldn't happen. 
      std::cin.clear(); // but for now we'll just clear the error and 
           // probably enter an infinite loop of failure 
     } 
     // failed for any reason. Blow off all user input and re-prompt 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     std::cout << "Please input a proper 'whole' number: " << std::endl; 
    } 
    return 0; // to satisfy compiler because a non-void function must always return. 
       // Never reached because of infinite for loop. 
}