如果 'input' 是一个整数,为什么 cin.fail() 会传递 input=100a?

why would cin.fail() pass input=100a if 'input' is an int?

int main(void)
{
   int valid_input();
   int ll_input=0;
   int resp;
   hash_table obj;
   int bucket;  
   while(1)
   {
      ll_input=valid_input();
      if(ll_input>10)
      {
        break;
      }
      obj.insert(ll_input);

   }
   obj.print_ll();


   return 0;
}    

int valid_input()

{
  int input;
  printf("\n\rEnter the value: ");
  std::cin >> input;
  while(std::cin.fail())
  {
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    printf("\n\rBad entry!\n\rEnter the value: ");
    std::cin>>input;
  }
  return input;
}

以上是代码,它适用于大多数字母数字组合,它拒绝用户输入,如 a、10aa、1003abc 等。但是,它在 100a、100b 等输入上通过。这可能是什么原因?

以下是截图中的输出

cin >> input 一发现任何非数字就停止读取,因此“100a”被解释为两个标记:“100”和“a”。

"100" 转换为 int 并退出 while(std::cin.fail()) 循环。这使得 "a" 留在流中以困扰 cin.

的下一次读取

抓住这个的快速方法,(在编写和解释方面是快速的,如果输入容易出错,执行起来不是最快的)

std::string token;
while (true) // or a countdown to kick out the truly moronic
{
    cin >> token;
    try
    {
        size_t pos;
        int result = std::stoi(token, &pos);
        if (pos == token.size())
        {
             return result;
        }
    }
    catch (...) // don't really care why std::stoi failed
    {
    }
}

std::stoi documentation.

更快的方法,如果预计会出现错误,请使用 strtol or similar 并跳过异常处理开销。