为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要有两个while (cin.get() != '\n') continue; 第一个是清除输入,第二个的作用是什么

为什么要有两个while (cin.get() != '\n') continue; 第一个是清除输入,第二个的作用是什么

慕田峪3750655 2016-08-09 21:19:19
struct golf{       char fullname[40];       int handicap;}int setgolf(golf & g){ cout << "Enter the name: "; cin.getline(g.fullname, Len); if (g.fullname == '\0') { return 0; } cout << "Enter the grade of " << g.fullname << " : "; while (!(cin >> g.handicap)) { cin.clear(); while (cin.get() != '\n') continue; cout << "Please enter an integer: "; }while (cin.get() != '\n') continue; return 1;}
查看完整描述

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

while (!(cin >> g.handicap)) 中:

cin >> g.handicap  表示从标准输入cin读取一个int,存入g.handicap。这个表达式在这里会返回布尔值,表示读取输入是否出现问题。

如果输入的根本就不是整型数,则 !(cin >> g.handicap) 为true,进入while循环。

cin.clear();  clear()函数不是清除输入,而是清除错误状态。 标准库的IO类如果出错,会为自身设置错误状态,这时是不能继续输入/输出的。 所以要先clear错误状态。然后

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

这一句不停从输入缓冲区中读取已经输入的字符,直到读走'\n'。这其实就是要消耗掉输入缓冲区中刚才错误输入的剩余内容。 所以这里才是清除掉错误输入


那么后面在 while (!(cin >> g.handicap)) 之外(也就是应该输入成功时),为什么还要加上 while (cin.get() != '\n') 来清除掉缓冲区的内容呢?  

因为就算 cin >> g.handicap 输入成功,缓冲区中还是可能留下别的东西的。假如输入的是 123abc\n ,那么123会被读取走,缓冲区中还会留下 abc\n。



另外,代码中还有一个错误: 前面 if (g.fullname == '\0')

fullname 是个char数组,并不代表char,不能用于和char比较。 而且数组名在这里会转换成指向其首元素的指针,指针也不能用来和char比较。 但有意思的是这里不并会报错

这是因为 '\0' 是char类型(值为0),也就是属于整型,而且你直接写出'\0'这个字面量属于整型常量,刚好整型常量0可以自动转换为指针类型(0指针,或称null指针),所以这里成了两个指针相比较。 但这句代码没有意义,因为fullname转换为指针类型肯定是个不为0的指针,它与0指针相比较肯定永远为false,所以这句if永远不会被执行! 

总之,这句 if 算是误用,且没有意义,但至少符合语法所以不报错。

查看完整回答
反对 回复 2016-08-09
  • 1 回答
  • 0 关注
  • 3649 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信