当我输入1.w时,为什么下面的验证代码会卡在cin.ignore上,当我输入w.1时会进入无限循环?

时间:2013-04-20 06:46:09

标签: c++ visual-studio-2010

当我输入时,为什么以下验证码会卡在cin.ignore上 1.w,当我进入w.1时进入无限循环? 我正在尝试创建验证数字输入的代码。我已经根据其他帖子提供的建议创建了代码,但我仍然遇到问题。

//The code is validation code used to check if input is numerical (float or integer). 
#include <iostream>
#include <string>
#include <limits> // std::numeric_limits
using namespace std;
int main ()
{
    string line;
    float amount=0;
    bool flag=true;

//while loop to check inputs
while (flag){ //check for valid numerical input
    cout << "Enter amount:";
    getline(cin>>amount,line);
//use the string find_first_not_of function to test for numerical input
    unsigned test = line.find_first_not_of('0123456789-.');

    if (test==std::string::npos){ //if input stream contains valid inputs
        cout << "WOW!" << endl;
        cout << "You entered " << line << endl;
        cout << "amount = " << amount << endl;
    }

    else{ //if input stream is invalid
        cin.clear();
        // Ignore to the end of line
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
  }

    return 0;
}

1 个答案:

答案 0 :(得分:3)

首先,'0123456789-.'应为"0123456789-."(请注意双引号)。前者是一个多字节字符文字。

当您输入1.w时:

  • 1cin>>amount提取。
  • .wgetline
  • 提取
  • 流为空,因此ignore等待输入

当您输入w.1时:

  • cin>>amount失败,failbit设置
  • 当流不好时,
  • getline无法提取,因此line保持为空
  • test等于npos,因此我们永远不会输入else块来清除流
  • 重复一遍