失败的输入帮助,Int和Char,C ++

时间:2013-12-27 07:19:59

标签: c++

我正在尝试确定用户是否输入了字符以外的内容,具体而言,他们只输入m或s。见下面的代码。

注意:

filingStatuschar

do
{

    cout << "Please enter your filing status (s for single, m for  married)" << '\n';
    cin >> filingStatus;

    if (cin.fail())
    {
        cin.clear();    
        dataTest = 1;
        cout << "Error, please enter a valid input!" << '\n';
        double dummyDouble;
        cin >> dummyDouble;
        if (cin.fail())
        {
            cin.clear();
            cin >> dummyString;
        }

    }
    else
    {

        if (filingStatus == 'm' || filingStatus == 's')
        {
            dataTest = 0;
        }

        else
        {
            cout << "Error, please enter either m or s!" << '\n';
            dataTest = 1;
        }

    }

} while (dataTest == 1);

这是问题所在,例如,如果输入1000,则输入不会失败。它将1存储在char中,并且因为1既不是m也不是S,它再次循环,然后它将0,循环再次置为0,等等。

我的理解是当它看到一个整数存储在char中时会失败,但显然它没有失败。

我的问题是:

  1. 为什么输入失败?如果有人输入字符串或数字表示失败,我怎么能改变呢?

5 个答案:

答案 0 :(得分:2)

输入没有失败,因为'1'是一个字符。数字是字符的子集。

阅读std::string。然后测试该字符串是否包含所需范围内的单个字符。

但请注意,使用>>读取字符串会在第一个空格处停止。要防止这种情况并改为读取整行,请使用std::getline()

进行阅读

答案 1 :(得分:0)

我假设fillingStatus属于char类型。

现在,即使您输入数字说“1”或“0”,它也会被读作字符。因此,cin不会失败。它只是按照你的代码继续循环。

此外,在读取无效字符时,应注意清除输入缓冲区,因为返回字符'\ n'与输入缓冲区中的其他字符一起保留。

我会这样做:

while ( !(cin >> fillingStatus) || (filingStatus != 'm' && filingStatus != 's') ) {
  cout << "Error, please enter either m or s!" << '\n'; // error message
  cin.clear(); // clear the error flag
  cin.ignore(numeric_limits<streamsize>::max(), '\n'); // ignore all invalid previous input
}

答案 2 :(得分:0)

一种方法是将fillingStatus更改为string并仅获取该字符串的第一个字符,看它是否失败。

或者,曾经有一种获取字符输入的方法,getche()我认为(自从我使用C ++已经很多年了,所以不要完全回忆起来)...你也许可以使用那也是。

由于

答案 3 :(得分:0)

由于您一次只读取输入的一个字符,因此您基本上无法判断用户输入的内容是多少,并且在您从输入流中读取更多内容之前它一直处于保持状态。

使用string一次读取一行数据并让程序对整个字符串作出反应将解决您的问题。

答案 4 :(得分:0)

std::string filingStatus ;
while(!(cin >> filingStatus ) || ( filingStatus  != "m" && filingStatus  != "f") )
{
    cin.clear();
    std::cout << "Error, please enter either m or s!" << '\n';
};