9

考虑以下 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);

它按预期工作。为什么会这样?

有人告诉我这与清除输入缓冲区有关。有人可以解释一下吗?

4

3 回答 3

9

scanf("%c", &c1)和之间的区别在于,scanf(" %c", &c2)没有空格的格式会读取下一个字符,即使它是空格,而有空格的格式会跳过空格(包括换行符)并读取下一个不是空格的字符。

在一种scanf()格式中,空格、制表符或换行符表示“如果有要跳过的空格,则跳过空格”。它不会直接“清除输入缓冲区”,但它会吃掉任何看起来类似于清除输入缓冲区的空白(但与此完全不同)。如果您在 Windows 上, usingfflush(stdin)清除输入缓冲区(空白和非空白字符);在 Unix 上并根据 C 标准,fflush(stdin)是未定义的行为。

顺便说一句,如果您键入整数后紧跟回车,则程序的输出以两个换行符结束:第一个在格式字符串中c,第二个在格式字符串中。因此,您可能已经看到:

$ ./your_program
123
int=123
char=

$

也就是说,scanf()读取换行符作为其输入。考虑一个替代输入:

$ ./your_program
123xyz
int=123
char=x
$

整数输入在读取“x”时停止;因此,字符输入读取“x”。

于 2013-08-28T14:56:56.377 回答
2

因为在输入数字并按 ENTER 后,新行将保留在缓冲区中,并将由第二个scanf.

简而言之,您在变量中保存了新行c

但是,如果您使用

scanf(" %c",&c);
//     ^

该空间将消耗新行,这将产生c您期望的值。

于 2013-08-28T14:57:46.217 回答
-1

您必须将指针传递给格式字符串指定的数据对象,所以

scanf("%c", c);

实际上会传递 c 的值,这反过来可能导致程序错误,

scanf("%c", &c);

将传递 c 的地址,允许 scanf 更改副本的值。

%c 之后的空格将强制它查找一个字符,然后是一个空格。如果没有空格,则不会读取字符

于 2013-08-28T14:59:49.387 回答