新手对一段简单的代码不是很理解,高手帮忙解释一个,谢谢.

nnh 2006-08-05 11:57:15
#include<iostream>
const int Max=5;
int main()
{
using namespace std;
double donation[Max];
cout<<"Please enter the donation.\n";
int i;
for (i=0;i<Max;i++)
{
cout<<"round #"<<i+1<<":";
while (!(cin>>donation[i])){
cin.clear();
while (cin.get()!='\n')
continue;
cout<<"Please enter a number: ";
}
}
system("pause");
return 0;
}

-------以下代码:
for (i=0;i<Max;i++)
{
cout<<"round #"<<i+1<<":";
while (!(cin>>donation[i])){
cin.clear();
while (cin.get()!='\n')
continue;
cout<<"Please enter a number: ";
}
}

while (!(cin>>donation[i])){ 是输入错误信息时,如a,则执行.
cin.clear(); 是不是把a和回车一起清除吗?
while (cin.get()!='\n') 是不是如果没有遇到换行时,执行?
continue;是继续执行哪个循环呢?

大家可以用输入一个字母,来对这代码进行解说吗?谢谢大家了.


...全文
765 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
pass86 2006-08-07
  • 打赏
  • 举报
回复
发现这段代码因该出自C++ Primer Plus(第五版)中文版169页的6.14 cingolf.cpp。
nnh 2006-08-07
  • 打赏
  • 举报
回复
高手出来帮忙解释一下呀?这问题对于我们这些初学者来说,不太好理解呀?
xiantongyuan 2006-08-06
  • 打赏
  • 举报
回复
#include<iostream>
const int Max=5;
using namespace std;

int main()
{
double donation[Max];
cout<<"Please enter the donation.\n";
int i;
for (i=0;i<Max;i++)
{
cout<<"round #"<<i+1<<":";
while (!(cin>>donation[i]))//当输入错误时执行下面语句,如输入了空格;
{
cin.clear(); //清除错误的状态
while (cin.get()!='\n')
continue; /*循环清除缓存中的数据据,循环的是while(cin.get()!='\n'*/
cout<<"Please enter a number: ";
}
}
system("pause");
}
jiojralf 2006-08-06
  • 打赏
  • 举报
回复
看来cin是比较牛差的,赋值给double的时候,会自动把123asd“enter”分为2个部分
123为赋给double的值,asd“enter”默认为另一次赋值
muzhinann 2006-08-06
  • 打赏
  • 举报
回复
也是初学者%……
pass86 2006-08-06
  • 打赏
  • 举报
回复
char ch;
cin.get(ch);<=>ch = cin.get();//对输入流的影响一样,且都读取了输入流的一个字符。
而cin.get()也是读取了输入流的一个字符,只不过没有传递给另外一个变量,所以,废弃的在输入流的字符就是这样在while循环中被处理掉的。
这个是我现在的理解的,可能有错的地方,没有理解透。请高手指点。

cunsh 2006-08-05
  • 打赏
  • 举报
回复
for (i=0;i<Max;i++)
{
cout<<"round #"<<i+1<<":";
while (!(cin>>donation[i])){ //当输入流发生错误时进入循环.
cin.clear(); //出错或者读到EOF时输入流会设置一个标志. 这句用来清除错误标志.
while (cin.get()!='\n') //丢弃缓冲区中的垃圾字符.
continue; //继续执行上一行的while, 这里相当于一条空语句 ;
cout<<"Please enter a number: ";
}
}
Dong 2006-08-05
  • 打赏
  • 举报
回复
大家可以用输入一个字母,来对这代码进行解说吗?谢谢大家了.
--------------------------------------
你在console下面输入:1234然后“Enter",
这个时候就读进了donation,但还存在"Enter"没有被读取,
这就要靠
while (cin.get()!='\n')
continue;
来处理掉了。
但其实,如果有cin.clear(); 那么后面的应该是不要的。
Dong 2006-08-05
  • 打赏
  • 举报
回复
cin.clear(); 是不是把a和回车一起清除吗?
------------------------------------------
他的作用是把输入缓冲区的内容清空,所以你说的是情况这一。

while (cin.get()!='\n') 是不是如果没有遇到换行时,执行?
----------------------
是啊,

continue;是继续执行哪个循环呢?
-------------------------------
因为在windows下,输入Enter键的时候输入的是"回车换行"两个字符,那么
他首先要读取“回车”\r字符,然后接下去循环下一去读取换行\n就接下去处理
读cin>>donation[i]
ifineedhelp 2006-08-05
  • 打赏
  • 举报
回复
咔嚓 又明白了一点
chouyankl 2006-08-05
  • 打赏
  • 举报
回复
我的理解,当输入123abc,当遇到a的时候,把123赋给数组,i也在此时+1,由于输入数据类型不对,于是cin"变坏了",然后用cin.clear()清除错误标志;
while (cin.get()!='\n')
continue;
cin.get()清除缓冲中的错误数据,当没有遇到换行符号时执行continue,回到while,直到遇到换行符时(这时候a,b,c都被cin.get()了),执行cout<<"Please enter a number: ";

我也是新手,不知道这样理解有错误么,有的话请指正,谢谢大家.
jiojralf 2006-08-05
  • 打赏
  • 举报
回复
string s;
for (i=0;i<Max;i++)
{
cout<<"round #"<<i+1<<":";
while (!(cin>>donation[i])){
cin.clear();
cin>>s;
cout<<s<<"\n";
cout<<"here\n";
/* while (cin.get()!='\n')
continue; */
cout<<"Please enter a number: ";
}

如此改动之后,效果不变
看来输入123abc并enter之后,cin>>donation[i]将123放入donation,然后i++,并进入while循环
cin.get()是用来将输入流清空
jiojralf 2006-08-05
  • 打赏
  • 举报
回复
while (cin.get()!='\n')
continue; //处理掉的是数字后面的直到"Enter"

强烈要求pass86出来解释一下
chenhu_doc 2006-08-05
  • 打赏
  • 举报
回复
这个a怎么处理呢?

它在输入流中啊
jixingzhong 2006-08-05
  • 打赏
  • 举报
回复
对输入数字进行合法性校验,
原理楼上都讲很清楚了 ...
jiojralf 2006-08-05
  • 打赏
  • 举报
回复
但最后结果是123赋值给donation了
chenhu_doc 2006-08-05
  • 打赏
  • 举报
回复
double donation[Max]; //如输入123a,(不是合法字符) 怎么把他赋值给double
nnh 2006-08-05
  • 打赏
  • 举报
回复
高手帮帮忙呀,谢谢了.
jiojralf 2006-08-05
  • 打赏
  • 举报
回复
donation[0]=123的原因就如pass86()说的那样
但是有个地方我还不是很理解

while (cin.get()!='\n')
continue; //处理掉的是数字后面的直到"Enter"
如果输入的1234abc则1234被读进了donation,后面的abc"Enter"在输入流中,让下一个输入错误,此时上面的代码就来处理了。

1234被读进donation,abc没有被读进是怎么做到的?估计对cin.get()不了解的原因
nnh 2006-08-05
  • 打赏
  • 举报
回复
不好意思,打错字:

我试过了,如输入123a,则会显示round #2Please enter a number:
再输入第二个数2,后边继续,后输出数组内容时,会发现donation[0]=123的?

这种情况又是怎么会产生的呢?
加载更多回复(5)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧