gpt4 book ai didi

c++ - while(!(cin >> x)) 如何重新提示输入

转载 作者:太空狗 更新时间:2023-10-29 20:11:48 24 4
gpt4 key购买 nike

while(!(cin >> ar[i]))
{
cin.clear(); // clears bad input
while(cin.get() != '\n')
continue;
cout << "Invalid input, please enter valid scores";
}

以上代码来自一个更大的文件。我从我的一本教科书中复制了这段代码,但我不太愿意使用它,因为我不明白它是如何工作的。

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

所以ar是一个空的整数数组,如果我决定输入'k',那么

!(cin >> ar[i]) 

是真的。

我从这里清除输入缓冲区(我认为这是正确的,我希望有人确认或对此提出异议)。然后终端打印“无效输入...”现在,如果我只是按 Enter 没有任何反应,但是 Enter 不是换行符吗?所以代码是不是应该这样读

while(cin.get() == '\n'

?

最佳答案

while(!(cin >> ar[i]))

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

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

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

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

  • eof(文件结尾,用于“正确”关闭/关闭输入,如 UNIX/Linux 中的 ^D、Windows 中的 ^Z 和结尾调用程序时的输入,如 echo input | program)。

上述所有方式均在“状态函数”here 下进行了描述.

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

{
cin.clear(); // clears bad input

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

    while(cin.get() != '\n')
continue;

这会尝试从终端读取字符,直到遇到换行符 \n。这个想法显然是为了清除可能导致 fail 条件的其余假定的无法解析的输入。可悲的是,如果问题是或变成了badeof 条件,那么此循环将挂起程序,旋转燃烧 CPU 无济于事。

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

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


Now if I just press enter nothing happens, but isnt enter the newline char?

每当外层循环执行 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\n";
exit(EXIT_FAILURE);
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Invalid input, please enter valid scores\n: ";
}

关于c++ - while(!(cin >> x)) 如何重新提示输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31173298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com