我正在读一本关于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轮
答案 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]
是int
,cin>>golf[i]
将返回true
(或在早期版本的C ++标准库中解释为true
的值)输入是int
。因此,while(!(cin>>golf[i]))
将重复,直到返回true
。
在while
循环中,您会发现忽略所有输入的代码,直到\n
循环仅在收到'\n'
输入后停止:
while(cin.get()!='\n')
continue;
它还会通过调用cin
清除表示clear()
处于失败状态的标志。
注意:此代码假设cin
永远不会结束,这会使其不安全。如果输入是从包含无效数据的文件中获取的,则该程序将陷入无限循环。