C语言关于格式说明里包含回车

来源:互联网 发布:张丕林 知乎 编辑:程序博客网 时间:2024/06/07 11:56
#include<stdio.h>void main(){int index;scanf("%d\n",&index);printf("%d\n",index);}

这是一个简单的程序,细心的你一眼看到这段程序会发现scanf()函数的格式说明里面的有个回车'\n',这段程序本意是从标准输入流stdio中获取一个int数然后输出到屏幕上,但是当你执行(这里使用VC++6.0或者GCC)时,你会发现当你输入一个int型字符并回车结束时窗口屏幕上并没有输出任何值,而是等待下一个数的输入如图所示(这里以vc++6.0为例):

                                       

或者此时你会继续敲入回车来执行程序输出(情况1),但结果并不如你所愿,但是如果程序开始执行时你输入一个数并回车后再输入一个数并回车时你会发现,屏幕上会输出你第一个输入的数,如图:

                                       

                                       

这是为什么呢?这里我们要了解scanf()的特点了:

用scanf()输入非字符型数据,遇到以下几种情况时程序将视作数据输入结束:
1、读取时遇到空格符、回车符、制表符(tab)
2、读取时达到指定长度,例如,scanf("%4d",&n);若你输入12345,则传送到n的只是1234
3、读取时遇到输入非数字字符(即不属于 0~9的字符)
scanf()函数中的格式说明字符串中若含有'\n'等等转义字符时,会导致数据输入不能按照正常方式中止。

主要问题是出在换行符‘\n’上,这告诉了scanf()函数中的格式说明字符串中说明函数需要去匹配一个换行符,然而scanf()本身又是过滤所有的空白字符(换行符与回车符、制表符都属于空白字符)所以当提取了第一个int型数据后,scanf()会继续查找下一个匹配的字符,但是它又本能的跳过了空白字符,所以一直匹配不上,如果你一直敲回车那是没用的,道理如上,直到你输入了其他的字符,但是那已经是失配了。例如:


输入a与b是敲入4和5,但是敲入时4与5之间多输入了数个空格符,但是并不影响scanf()读取数值,正是因为scanf()读完一个字符会继续查找下一个匹配的字符,但是它又本能的跳过了空白字符。所以情况1中所说问题是不管你输入一个数字后输入多少个回车scanf()都会把这些回车当成一个空白字符来匹配格式说明字符串里的回车,所以当scanf()匹配完回车后遇到一个非空白字符就停止读取,这个非空白字符匹配失败,当再次遇到回车时便执行下一个语句。


0 0
原创粉丝点击