• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

为什么要有两个while (cin.get() != '\n') continue; 第一

struct golf
{
       char fullname[40];
       int handicap;
}
int setgolf(golf & g)
{

        cout

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与1

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 算是误用,且没有意义,但至少符合语法所以不报错。

使用道具 举报

发新帖

发布任务需求已有1031166位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!