scanf在C语言学习中比较常用,但因为其涉及屏幕缓冲区导致有的时候会调入陷阱,下面分享一下常见的需要注意的事项:
1.输入末尾带有回车'\n'
当我们输入数据后,最后按下回车时,屏幕缓冲区的末尾都会含有这个字符
scanf的返回值是成功读取的变量个数,正常情况下这个数量等于占位符的数量
2.读取时的匹配规则
scanf会根据占位符的类型到缓冲区去取相应的数据,其中%c什么都能取,包括空格等符号
如果在%c前加了空格,就会跳过这些空格读取第一个字符
其中因为%c前面没有空格,所以a把空格读走了,引发后续错误
%s跳过空格开始读,遇到空格停止,这里很容易被坑。要读取空格,建议使用gets
当读到占位符不匹配的类型时会自动停止读取,由下一个继续
如果当前匹配不成功,会直接中断读取,后续的占位符不会起到作用
3.回车换行是'\n',回车不换行是'\r'
我们输入数据后敲的回车都是\n,相当于光标换行并回到起始位置,而\r只是回到起始位置,如果进行后续操作,会进行覆盖
4.返回值EOF和0的区别
EOF特指读取错误(不好验证)和文件末尾,一般在读取文件时用它来判定
在控制台中,如果用EOF来作为循环条件的话,那么程序会被卡住,因为scanf会一直等我们输入,这个时候用0作为返回值的循环条件更好,因为下一个循环如果读不到想要的值,scanf的返回值就是0,这个时候循环就结束了。
在循环读取时,scanf会跳过每次按的\n(回车),所以这里不会因为\n不匹配%d而中断
5.用getchar清空缓冲区
用getchar写一个循环,可以帮助我们清除\n,防止后续程序出错
这里看到,不清空的话,%c会直接读走\n