While(!(Cin&>;>x))如何重新提示输入

2022-09-05 00:00:00 iostream c++
while(!(cin >> ar[i]))
    {
        cin.clear(); // clears bad input
        while(cin.get() != '
')
            continue;
        cout << "Invalid input, please enter valid scores";
    }
上述代码来自一个大得多的文件。我从我的课本上复制了这段代码,我真的不喜欢使用它,因为我不明白它是如何工作的。

我将其用作处理输入错误的措施。

因此ar是空数组,如果我决定输入‘k’,则

!(cin >> ar[i]) 

为真。

从这里我将清除输入缓冲区(我认为这是正确的,我希望有人对此予以确认或质疑)。然后,终端打印"无效输入..."。 现在,如果我只按Enter,没有任何反应,但不是输入换行符吗?那么代码不应该是

while(cin.get() == '
'


解决方案

while(!(cin >> ar[i]))
尝试解析cin中的值并将其存储在ar[i]中。默认情况下,>>首先跳过空格,然后查看cin中的字符是否描述了任何ar[i]类型的合法值。如果找到合法值,则cin流状态保持good,其operator bool() const将在给定布尔not/!操作的情况下启动,从而while循环将中断。

如果解析失败,流状态将设置为以下一个或多个:

  • bad(如果出现一些不可恢复的流错误,如通过网络连接提供的标准输入断开),

  • fail(如果字符没有形成该类型的合法值),或

  • eof(文件结尾,表示输入的"正确"关闭/关闭,由^D(在Unix/Linux中由^D提供,在Windows中由^Z提供,在echo input | program中由程序调用时输入结束)。

上述所有模式均在"状态函数"here中介绍。

如果由于上述任何错误条件而进入循环...

{
    cin.clear(); // clears bad input
...这不会清除流中的任何输入数据,但会清除badeoffail状态标志,之后可以进行进一步的输入尝试,尽管当尝试进一步输入时,处于badeof状态的流可能会立即重新进入该状态(但并非总是-如果用户键入/生成EOF代码,然后再次键入实际文本,则某些操作系统可能会在eof条件后允许成功输入...

    while(cin.get() != '
')
        continue;
尝试从终端读取字符,直到遇到换行符 。这个想法显然是为了清除先前可能导致fail条件的其他假定的无法解析的输入。遗憾的是,如果问题是或变成了badeof条件,则此循环将挂起程序,使燃烧的CPU旋转无用。

    cout << "Invalid input, please enter valid scores";
}

如果问题只是键入错误的值,并且没有badeof条件,则cout将提示您进一步输入。


现在,如果我只按Enter键,则不会发生任何事情,但没有输入换行符?

每当外部循环执行cin >> ar[i]时,它都会跳过空格,包括您键入的任何额外换行符,直到它看到一些输入(可能需要是以换行符结尾的完整行,才能被终端或将其提供给程序的程序刷新)或badeof条件。内部While循环不是用来清除空行的-它正在尝试丢弃其中包含假定非数字文本的行。


更正代码:

while (!(std::cin >> ar[i]))
{
    if (std::cin.bad() || std::cin.eof())
    {
        std::cerr << "Fatal error on cin while reading numbers
";
        exit(EXIT_FAILURE);
    }
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '
');
    std::cout << "Invalid input, please enter valid scores
: ";
}

相关文章