我正在浏览C ++ Faq的这个链接。 http://www.parashift.com/c++-faq/istreams-remember-bad-state.html
在第一次迭代后循环结束的给定程序中。
char name[1000];
int age;
for (;;) {
std::cout << "Name: ";
std::cin >> name;
std::cout << "Age: ";
std::cin >> age;
}
如上所述,数字提取器在输入缓冲区中留下非数字。可能是它的基本内容,但有人可以解释如何满足循环终止条件??
答案 0 :(得分:3)
for (;;)
是一个无限循环,与while(1)
,while(true)
答案 1 :(得分:3)
我建议您重新阅读您发布的链接中的问题。
为什么我的程序在第一次迭代后忽略了我的输入请求?
这清楚地表明存在多次迭代。实际问题是第一个迭代之后的所有迭代都没有从cin接收到预期的值。这通常是由于两个主要原因:
15f
视为一个时代。将读取15,留下f
。然后将为该名称读取该值。有关第一个问题的示例,请尝试键入15f
作为年龄,看看会发生什么。
Name: Test
Age: 15f
name = Test, age = 15
Name: Age:
对于第二个问题的一个非常明确的例子,尝试键入年龄的字符串,看看会发生什么。你最终会得到一个无限循环,不再等待任何输入。
Name: Test
Age: f
Name: Age: Name: Age: Name: Age: Name: Age: Name: ...
要解决这些问题,必须丢弃所有直到(并包括)新行的输入。这是使用std :: cin.ignore方法完成的,如同一页面所示。如果设置了失败位,您还需要使用std::cin.clear()
清除它。