对于没有初始化和条件的循环

时间:2014-10-20 18:10:17

标签: c++ for-loop

我正在浏览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;
}

如上所述,数字提取器在输入缓冲区中留下非数字。可能是它的基本内容,但有人可以解释如何满足循环终止条件??

2 个答案:

答案 0 :(得分:3)

for (;;)是一个无限循环,与while(1)while(true)

相同

答案 1 :(得分:3)

我建议您重新阅读您发布的链接中的问题。

  

为什么我的程序在第一次迭代后忽略了我的输入请求?

这清楚地表明存在多次迭代。实际问题是第一个迭代之后的所有迭代都没有从cin接收到预期的值。这通常是由于两个主要原因:

  1. &gt;&gt;提取器在缓冲区中留下了额外的非数字。当您使用&gt;&gt;提取器,它丢弃所有前面的空格,读取它需要的字符,然后不再读取任何字符(包括空格)。这方面的一个例子是尝试将15f视为一个时代。将读取15,留下f。然后将为该名称读取该值。
  2. 失败位已设置。在上面的示例中,如果在前面的空格之后没有可接受的字符,则将设置失败位。这方面的一个例子是尝试将“f”视为一个时代。将保存此失败位,并且在清除之前不会尝试将来的读取。
  3. 有关第一个问题的示例,请尝试键入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()清除它。