猿问

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

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;

}



慕田峪3750655
浏览 3652回答 1
1回答

onemoo

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 算是误用,且没有意义,但至少符合语法所以不报错。
随时随地看视频慕课网APP
我要回答