PPT上猜数字的防止非法字符输入的写法:
ret = scanf("%d", &guess);
while (ret != 1)
{
while (getchar() != '\n');
printf("please guess:");
ret = scanf("%d", &guess);
}
counter++;
1 ret的用法
百度某回答说:“scanf函数成功输入的数值个数 我们可以通过判断if(scanf("%d",&man)==1)判断是否输入成功。”
原来的代码看起来是将scanf读到的值赋给ret?
于是查到了
c语言scanf("%d%d",&a&b)解释与EOF的使用
来源于:https://blog.csdn.net/qq_37909508/article/details/79498051
scanf("%d%d", &x, &y):
如果x和y能够被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。
EOF:EOF是一个计算机术语,为End Of File的缩写,在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
所以是将scanf的返回值给ret,因此可以理解基于ret的操作为什么是与1比较大小了。
2 对第四行的理解
为什么这句话可以起到“清除输入缓冲区的非法字符”的作用?
“这句循环执行getchar语句,会依次读取缓冲区的字符直到回车键结束符,读取完成后执行一句空语句“;”,这样所有缓冲区的字符都读入程序并依次被覆盖执行了。”
就是说
当getchar()函数的返回值一直不等于回车符的话,就执行while后的语句;但while后面只有一个分号,也就是一个空语句。
直到收到回车符前,getchar()会一直从缓冲区中提取一个字符,然后与回车符比较,作为循环继续与否的判断条件;只要为true,就会一直执行getchar取字符、比较的过程。
当取到了回车符,也就不再符合循环控制表达式时,退出循环。
因此这句话的目的是“不断读取用户输入的字符,当读取到的字符为回车符的时候停止循环。”
接下来继续提醒用户重新输入,再重新赋值、比较,直到输入正确,退出循环。再计数。