2016-07-21 3 views
1

Im пытается заставить программу принимать только х как целое число, а затем запрашивать другое целое число, y. Однако, когда я ввожу плавающую точку в x, она принимает десятичную часть ввода и делает это значение y. Я не уверен в своей ошибке здесь.Пользователь C++ вводит плавающую точку вместо целого

#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

Что вы подразумеваете под "Y" значением? Если вы введете «123.456» и прочитаете его как целое число, 123 будут считаться целыми числами. – user3344003

+0

Возможно, вы можете проверить, вводит ли пользователь ''.'' после первого целого числа и возвратить ошибку в этом случае? – KABoissonneault

+0

yes x будет 123, но после этого программа сразу же распечатывает X = 123 Y = 0. –

ответ

0

поскольку каждая консоль ввода на C++ рассматривается как строка, а затем под GetInt() метод я хотел бы сделать следующее:

 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 
    } 

первый в то время как в основном говорит, если поток (консольный ввод), или следующий поток char (.peek()) не является \ r или a \ n очищает поток и получает первый символ.

, в то время как этот символ не является \ n, а не конечным файлом (EOF), тогда получите следующий символ и так далее.

Если возникла проблема, отобразите сообщение об ошибке пользователю и запросите у пользователя значение x.

затем вызовите ту же функцию, чтобы повторно протестировать вход (рекурсивно), если все хорошо, верните значение x.

теперь вы можете вызвать эту функцию, чтобы оценить значение Y.

Примечание: IStream является частью библиотеки iostream в основном CIN

Примечание: вызовите функцию следующим образом:

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

Большинство конверсий в int останавливаются, как только они находят что-то, что не может быть частью int, и только несколько функций преобразования сообщают вам, прекращаются ли они до разбора всей строки.

Давайте использовать one of those few, не так ли?

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. 
} 
Смежные вопросы