admin 管理员组文章数量: 1184232
2024年3月7日发(作者:如何用switch编程分段函数)
[cpp] view plaincopy
1. #include
2. int main (void)
3. {
4. int i ;
5. char ch ;
6.
7. scanf("%d",&i) ;
8. scanf(" %c",&ch) ; //这行的%C前有个空格
9. printf("i = %dnch = %cn", i, ch) ;
10.
11. /* 输入100 y 后的输出结果:
12. i = 100
13. ch = y */
14.
15. return 0 ;
16. }
有些朋友或许会有疑问,为什么 scanf(" %c",&ch) 中的%c 前面要加一个空格,空格的作用到底是什么…在这里可以告诉大家,%c前面的空格就是用来屏蔽空白符的,但想要弄明白这个问题,必须要知道C语言 scanf() 函数的特性,以及scanf()与缓冲区、标准输入流之间的联系。 但在此之前,我们先介绍两个专业术语。
1、缓冲区
缓冲区是一块存放临时输入数据的内存,我们在键盘上输入数据之所以不会马上显示,就是因为数据存放在了缓冲区,在上面例子中,当我们按下回车键后,缓冲区的数据会传送到标准输入流。
2、标准输入流
标准输入流(stdin)是文件指针,scanf()就是从标准输入流获取数据。 在以后的文章中,会接触到fscanf函数的介绍中详细解释。
以上面代码为例,当执行到scanf()时,开始等待用户输入,当我们输入数据,在按下回车键前会把数据储存在缓冲区,按下回车键后,会把数据以及换行符(n)一起传送到标准输入流(stdin)中,scanf()就是从标准输入流中或许数据,上面第一个scanf()要读入一个整数,它从标准输入流中查找,跳过空白符(空格、换行符、制表符),如果遇到数字,则开始读入,直到遇到非数字的字符结束,最后计算读取到的数值,储存到相关变量中。
如果能理解上面一段话,那么你应该知道%c前空格的作用了,如果不能,请看看%c前不加空格程序的输出结果。
[cpp] view plaincopy
1. #include
2.
3. int main (void)
4. {
5. int i ;
6. char ch ;
7.
8. scanf("%d",&i) ;
9. scanf("%c",&ch) ;
10. printf("i = %dnch = %cn", i, ch) ;
11.
12. /* 输入100 :
13. i = 100
14. ch = */
15.
16. return 0 ;
17. }
请看上面的程序,我们输入100后,咦,怎么程序中止了,马上输入结果了? 但真的是终止了吗?别忘了,标准输入流中除了100外,还有一个换行符'n'。 第一次scanf()读取了100后,把'n'留在了标准输入流,第二个scanf()就从输入流中获取换行符了,由于scanf()函数的特性,空白符直接忽略,因此程序便结束了,第二个scanf()函数看似失效,实际上是执行完毕了。
所以对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符。读到这,大家应该理解了吧?
原因何在,在%前面加一个空格就这么有用,答案是肯定的,就是%前面的空格在起作用,读者看看此文章的前面部分,在scanf的使用过程中应注意的问题中已经指出:“scanf()的格式控制串可以使用空白字符或其它非空白字符,使用空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。” 所以在%前面加上了空格(空格属于空白字符,此外还有像制表符等也属于空白字符),在输入过程中,将略去输入中的一个或多个空白字符,所以我们输入的0 1 2 3 4 5 6 7 8 9这些字符中的空白字符就被略去了,字符9也就正确的打印出来了,这样子解释,相信大家都看明白勒吧
版权声明:本文标题:scanf加空格的问题 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1709777199a546253.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论