有什么方法可以检查用户输入的数字吗?

时间:2019-12-10 16:01:07

标签: c++

我制作了一个用户需要猜测数字的游戏,

该数字是通过rand函数生成的。

如果用户输入了无效的数字或字符,则打印错误消息。

我的问题是cin.fail()对我来说效果不佳,例如,当我输入一个字符作为输入时,我的程序总是打印“ Too Low!”,可能是因为它计算了字符的值(ASCII TALBE)。

有什么建议吗?

我的代码:

void Game()
{
    srand(time(0));

    int iGuess;
    const unsigned int iNum = (rand() % 1000 + 1);

    Start:
    system("cls");

    cout << "\n Guess the Num: "; cin >> iGuess;
    if (iGuess == iNum) {
        system("color A");
        cout << "\n\n Good Job! You Won!";
        exit(0);
    }
    if (iGuess > iNum) {
        cout << "\n\n Too High!";
        Sleep(3000);
        goto Start;
    }
    if (iGuess < iNum) {
        cout << "\n\n Too Low!";
        Sleep(3000);
        goto Start;
    }
    if (cin.fail()) {
        cout << "Input has failed! & Error Code: " << GetLastError();
        Sleep(3000);
        goto Start;
    }
}

3 个答案:

答案 0 :(得分:1)

首先,您可以检查对于,布尔转换(explicit operator bool() const)等同于!failed()(请参见https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool)。

这允许您编写:

void Game()
{
  srand(time(0));

  int iGuess;
  const unsigned int iNum = (rand() % 1000 + 1);

Start:
  system("cls");

  cout << "\n Guess the Num: ";
  if (cin >> iGuess)
  {
    if (iGuess == iNum)
    {
      system("color A");
      cout << "\n\n Good Job! You Won!";
      exit(0);
    }
    if (iGuess > iNum)
    {
      cout << "\n\n Too High!";
      Sleep(3000);
      goto Start;
    }
    if (iGuess < iNum)
    {
      cout << "\n\n Too Low!";
      Sleep(3000);
      goto Start;
    }
  }
  else
  {
    cin.clear();                        // clear error flags
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // empty buffer 
    assert(cin);                        // check that we are still in a good state

    cout << "Input has failed! & Error Code: " << GetLastError();
    Sleep(3000);
    goto Start;
  }
}

如果发生错误,重要的是不要忘记以下步骤:

清除错误标志:

cin.clear(); 

删除先前存储在缓冲区中的所有数据(这些数据不能解释为整数)

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

检查我们是否处于良好状态(防御性编程,可能会发生另一个错误)

assert(cin); 

更新: 最好使用ignore,我的第一个版本是

while (cin.get() != '\n') continue; 

我的更新是:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

答案 1 :(得分:0)

我建议使用do while格式来获取您的输入。

#include <stdlib.h>
#include <time.h>
#include <iostream>
#ifdef _WIN32
#include <windows.h>

void sleep(unsigned milliseconds)
{
    Sleep(milliseconds);
}
#else
#include <unistd.h>

void sleep(unsigned milliseconds)
{
    usleep(milliseconds * 1000); // takes microseconds
}
#endif
using namespace std;

int main()
{
    srand(time(0));

    int iGuess;
    const unsigned int iNum = (rand() % 1000 + 1);

Start:
    system("cls");

    do
    {       
        if (!std::cin)
        {
            std::cin.clear();
            std::cin.ignore(10000, '\n');
            std::cout << "\nFailed input";
        }
        std::cout << "\n Guess the Num: ";
    } while (!(std::cin >> iGuess));


    if (iGuess == iNum) {
        system("color A");
        cout << "\n\n Good Job! You Won!";
        exit(0);
    }
    if (iGuess > iNum) {
        cout << "\n\n Too High!";
        Sleep(3000);
        goto Start;
    }
    if (iGuess < iNum) {
        cout << "\n\n Too Low!";
        Sleep(3000);
        goto Start;
    }
}

答案 2 :(得分:0)

使用std::string_viewstd::isdigit()解析输入字符串的最简单方法。

char str[] = "12abc12"; 

int alphabet = 0, number = 0, i; 
for (i=0; str[i]!= '\0'; i++) 
{ 
    // check for alphabets 
    if (isalpha(str[i]) != 0) 
        alphabet++; 

    // check for decimal digits 
    else if (isdigit(str[i]) != 0) 
        number++; 
} 

https://www.geeksforgeeks.org/isalpha-isdigit-functions-c-example/