考虑以下 C 代码片段:
#include <stdio.h>
int main()
{
int a;
char c;
scanf("%d",&a);
scanf("%c",&c);
printf("int=%d\n",a);
printf("char=%c\n",c);
}
我只能输入整数,不能输入字符。输出只是整数值,第二个 printf 语句不会输出任何值。
但是,如果我在格式说明符之前使用空格:
scanf(" %c",&c);
它按预期工作。为什么会这样呢?
有人告诉我这与清除输入缓冲区有关。有人可以解释一下吗?
和...之间的不同scanf("%c", &c1)
and scanf(" %c", &c2)
不带空格的格式会读取下一个字符,即使它是空格,而带空格的格式会跳过空格(包括换行符)并读取下一个不是空格的字符。
In a scanf()
格式、空白、制表符或换行符表示“如果有要跳过的空白,则跳过”。它不会直接“清除输入缓冲区”,但它确实会吃掉任何空白,这看起来与清除输入缓冲区类似(但与此完全不同)。如果您使用的是 Windows,请使用fflush(stdin)
清除输入缓冲区(空白和非空白字符);在 Unix 上并根据 C 标准,fflush(stdin)
是未定义的行为。
顺便说一句,如果您键入整数并紧跟回车符,则程序的输出将以两个换行符结束:第一个换行符位于c
格式字符串中的第二个。因此,您可能已经看到:
$ ./your_program
123
int=123
char=
$
那就是scanf()
读取换行符作为其输入。考虑替代输入:
$ ./your_program
123xyz
int=123
char=x
$
当读取到“x”时,整数输入停止;因此,字符输入读取为“x”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)