失败的输入帮助,国际和字符,C++

Failed Input help, Int and Char, C++

本文关键字:字符 C++ 输入 帮助 失败      更新时间:2023-10-16

我试图确定用户是否输入字符以外的内容,特别是他们只输入m或s。请参阅下面的代码。

注意:

filingStatus是一个char

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,依此类推。

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

我的问题是:

  1. 为什么输入没有失败?如果有人输入字符串或数字失败,我该如何更改它?

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

读成std::string.然后测试该字符串是否由所需范围内的单个字符组成。

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

我假设fillingStatuschar类型。

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

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

我会像下面这样做:

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
}

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

或者,曾经有一种获取字符输入的方法,getche()我认为(我已经在C++工作了很多年了,所以不记得了)......你也许也可以使用它。

谢谢

由于您一次只读取一个字符,因此您基本上无法分辨出用户输入了更多,并且它一直保持,直到您从输入流中读取更多。

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

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