[英]C++ cout in while loop prints twice
我修改了Bjarne Stroustrup编程:C ++中的原理和实践中的代码,试图检查给定的输入是否有效:
#include <iostream>
using namespace std;
int main()
{
cout << "Please enter your first name and age: ";
string first_name = "???";
int age = -1;
cin >> first_name >> age;
while (!cin) {
cin.clear();
cout << "Sorry, can you enter that again? ";
cin >> first_name >> age;
}
cout << "Hello, "<<first_name<<"! (age "<<age<<")\n";
return 0;
}
这可以按预期工作,除了"Sorry, can you enter that again? "
这两个字样被打印两次,一次是在第二次输入之前,一次是之后。
任何人都知道为什么会发生这种情况? 谢谢。
清除失败位是不够的,还必须清除输入缓冲区中的任何剩余字符。 此外,代码看起来比必要的更复杂。 以下作品:
std::string name;
int age;
std::cout << "Please enter your name & age: ";
while (not (std::cin >> name >> age)) {
std::cout << "Sorry, can you enter that again? ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
std::cout << "Hello " << name << " (" << age << ")\n";
哦,是的,不要忘记刷新输出流,我不认为这将自动为您完成。
也就是说,标准输入/输出流就是流 ,所以它们实际上并不适合交互式输入。 您应该使用适当的库,例如readline
或ncurses
。
为了说明为什么这很重要,想象用户输入“ foo42
”并按回车键。 你希望程序现在说“对不起,你能再次输入吗?”但事实并非如此。 相反,它温顺地等待用户输入第二个令牌。 从可用性的角度来看,这肯定不是你所期望的。
这取决于你输入的内容!
输入"Tim 29"
:作品,“你好蒂姆(29)”。
输入"Tim Tom 29"
:作品,一次重复,“你好汤姆(29)”。
输入"Tim Tom Tina 29"
:作品,两次重复,“你好蒂娜(29)”。
我假设你正在尝试第三个。 第一个失败是Tom
,他不是一个数字。 重置错误状态很好,但它没有摆脱Tom
。 我们仍然需要再次失败的尝试才能消耗他( Tina
失败了,那时他不是一个数字)。 只有这样,我们才准备好Tina
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.