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