这几天刷题老遇到scanf函数读取不了的情况,于是我就上网一搜,发现scanf函数真的非常奇妙,于是便有了这篇文章。
这几天没更新的原因是我中招了,以后没有伤病情况下会正常更新。
scanf的基本格式想必大家都会写,这里就不做举例演示了
首先我们要知道scanf'函数的转化原理:
1. 我们在输入前未被scanf存起来的值,其实都是字符,例如数字123,在为被存起来是字符‘1’ ‘2’ ‘3’ 而经过%d转换完成后才变成数字123
2. “缓冲区”(划重点,这个可太恶心了,困扰我好几天)
当程序运行到scanf时,这个时候程序会从缓冲区这个里面读取
注意:
当数据类型时%d的时候:系统会忽略缓冲区的(空格,回车,Tab按键,等);
而%c时:系统会读取缓冲区中排在第一个的字符包括(空格,回车,Tab按键,等,无论是什么字符)。
下面看案例
在这个例子中,我们可以直观清楚看到,我们输入 123 回车 后,a中存储的数据是123,而b中存储的是\n,这就直观的说明了注意中所提到的问题。
遇到这个问题我们可以利用getchar()把\n放入,便不会出现这中状况。
还有一类情况就是scanf函数中%d后面的问题
在scanf函数后面不能加空格,\n(画圈圈,下课考)
假如你加入空格和\n后,就是这种情况,输入后读取不了,即使你按了1w行空格他还是闪光标。
原因是因为程序会一直忽略空白符,除非有非空白符的出现,程序才会读取,否则不论我们怎么按回车键他一直都读取不了。
最后我们总结一下:
1. 在我们使用scanf函数时,一定要注意缓冲区这个东西
2. 明确%d和%c的使用规则,注意%c吞字符的事情
3. scanf函数后面不能加空格,\n等,一定要注意