有人可以向我解释这段代码是如何工作的吗?(如果预期的数值和用户输入其他输入,程序会再次询问用户输入)

时间:2017-03-27 16:25:56

标签: c++

我正在读一本关于c ++(c ++ primer plus)的书,并找到了这段代码。

该程序的目的是,如果用户希望数字输入将其读取,例如数组 - >

1)将cin重置为新输入
2)摆脱不良输入
3)提示用户再试一次(本书的确切词语)

以下是代码 - >(从书中复制的确切代码)

#include <iostream>
const int Max=5;
int main()
{
    using namespace std;

    //get data
    int golf[Max];
    cout<<"please enter your golf scores.\n";
    cout<<"you must enter "<<Max<<" rounds.\n";
    int i;
    for(i=0;i<Max;i++) {
        cout<<"round #"<<i+1<<": ";
        while(!(cin>>golf[i])) {
            cin.clear();
            while(cin.get()!='\n')
                continue;
            cout<<"PLease enter a number: ";
         }
    }
    double total=0.0;
    for(i=0;i<Max;i++)
        total+=golf[i];

    cout<<total/Max<<" = average score "<<Max<<" rounds\n";
    return 0;
}

我不理解的特定部分是:

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

我有点不清楚cin.clear()的功能,continue的需要,以及while测试分析的作用以及它是如何工作的。

试运行 - >

(斜体部分是用户输入)

请输入您的高尔夫分数。
您必须输入5轮 第1轮: 88
第2轮: 87
第3轮: duh
请输入一个数字: 103
第4轮: 94
第5轮: 86
91.6 =平均得分5轮

2 个答案:

答案 0 :(得分:1)

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

 {

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


    cout<<"PLease enter a number: ";

 }

首先让我们举例说明while条件。它似乎检查表达式(cin >> golf[i])的值是否为false。 cin >> golf[i]的代价是cin本身。那怎么可能是假的呢?如果&gt;&gt;输入流的操作失败,设置了名为fail的标志。这就是运营商!检查。因此,条件意味着在尝试读取数字后,对象cin已设置失败,请执行...

现在,一旦设置了失败标志,您就无法使用输入流。除非重置失败标志,否则您将无法继续从流中读取数据。这就是cin.clear()所做的。

然后它通过逐个字符地读取,直到到达行尾来消除坏输入行的其余部分(因为&gt;&gt;失败而没有消耗)。

最后它会提示用户输入新内容。

答案 1 :(得分:0)

由于golf[i]intcin>>golf[i]将返回true(或在早期版本的C ++标准库中解释为true的值)输入是int。因此,while(!(cin>>golf[i]))将重复,直到返回true

while循环中,您会发现忽略所有输入的代码,直到\n循环仅在收到'\n'输入后停止:

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

它还会通过调用cin清除表示clear()处于失败状态的标志。

注意:此代码假设cin永远不会结束,这会使其不安全。如果输入是从包含无效数据的文件中获取的,则该程序将陷入无限循环。