遇到如下代码的时候会有这个现象 - scanf("%d",&a);
- scanf("%c",&b);
复制代码
我们的本意是让程序读取一个数字和一个字符,然后你输入10(回车),然后发现程序已经流过scanf("%c",&b);这一句了,我们发现变量a存的是10没问题,但是变量b存的是一个回车。这是咋回事?
C语言的输入有这么几个特点:
- 有一个输入的缓冲区
- 在进行输入的时候,所有输入的字符(包括空格、换行)都先被放到缓冲区中,直到按下回车,这是'\n'进入缓冲区,同时开始读取字符。
- scanf匹配到一个字符,就会在缓冲区中删掉这个字符
- scanf 函数在读取整型数、浮点数、字符串 时会忽略\n’(回车符)、空格符等字符 (忽略是指 scanf 函数执行时会首先删除这些字符,然后再阻塞)。
- scanf在读取%c的时候不会忽略任何字符
所以执行上面那一段程序的时候发生了这么些事情
所以为了避免出现这种情况,如果要读取%c的时候看看需不需要清空标准输入缓冲区fflush(stdin);
然后如果同时接收多个输入的时候混着%c的时候就要注意,比如说scanf("%d %c")的时候,你输入3 x(回车)就是OK的,因为3被%d读取到了,3和x之间的空格也被"%d %c"之间的空格匹配上了,所以从标准缓冲区中删掉了,然后剩下的x就被%c匹配到了。但是如果你scanf("%d%c")的情况下输入3 x(回车),那么x里面就是空格。 |