While(!(Cin&>;>;x))如何重新提示输入
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
...这不会清除流中的任何输入数据,但会清除bad
、eof
和fail
状态标志,之后可以进行进一步的输入尝试,尽管当尝试进一步输入时,处于bad
或eof
状态的流可能会立即重新进入该状态(但并非总是-如果用户键入/生成EOF代码,然后再次键入实际文本,则某些操作系统可能会在eof
条件后允许成功输入...
while(cin.get() != '
')
continue;
尝试从终端读取字符,直到遇到换行符
。这个想法显然是为了清除先前可能导致fail
条件的其他假定的无法解析的输入。遗憾的是,如果问题是或变成了bad
或eof
条件,则此循环将挂起程序,使燃烧的CPU旋转无用。
cout << "Invalid input, please enter valid scores";
}
如果问题只是键入错误的值,并且没有bad
或eof
条件,则cout
将提示您进一步输入。
现在,如果我只按Enter键,则不会发生任何事情,但没有输入换行符?
每当外部循环执行cin >> ar[i]
时,它都会跳过空格,包括您键入的任何额外换行符,直到它看到一些输入(可能需要是以换行符结尾的完整行,才能被终端或将其提供给程序的程序刷新)或bad
或eof
条件。内部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
: ";
}
相关文章