C 为什么在输入缓冲区中只有一个(两个空格中的一个)空格被视为字符?

C 为什么在输入缓冲区中只有一个(两个空格中的一个)空格被视为字符?,c,buffer,C,Buffer,我试图了解输入缓冲区是如何工作的。所以我写了一段代码: #include<stdio.h> int main(){ int a,b; char c,d; scanf("%d %d",&a,&b); scanf("%c %c",&c,&d); printf("%d*%d*%c*%c",a,b,c,d); return 0; } 所以我希望我的输出是: 5*4* * 输出:

我试图了解输入缓冲区是如何工作的。所以我写了一段代码:

    #include<stdio.h>
    int main(){
    int a,b;
    char c,d;
    scanf("%d %d",&a,&b);
    scanf("%c %c",&c,&d);
    printf("%d*%d*%c*%c",a,b,c,d);
    return 0;
    }
所以我希望我的输出是:

    5*4* *
输出:

    5*4* *q
有人能解释一下为什么它只把两个空格中的一个(一个在5到4之间,另一个在4到q之间)视为一个字符,而不是两个?这两个空格中哪一个是作为字符打印的?

如果我们从

scanf("%d %d",&a,&b);
然后读取
5
4
,将输入缓冲区保留为
“qw”

现在当你这么做的时候

scanf("%c %c",&c,&d);
第一个
“%c”
将读取空格,而另一个读取
'q'
,而
'w'
将保留在输入缓冲区中

这是因为
“%c”
格式不跳过空白。它将读取输入缓冲区中的任何字符


例如,如果您阅读,您将看到格式
%c“
”%[“
%n”
没有丢弃前导空格。

对于
%d
scanf
查找数字并忽略空格,但是对于
%c
则不会忽略
q
之前的空格。

请考虑

scanf("%d %d%c %c",&a,&b,&c,&d);
// input "5 4 qw"
%d”
:读取/丢弃前导空格(没有),然后读取/另存为
int
'5'
->
5

:读取/丢弃空白(1个空格:
)。
%d”
:读取/丢弃前导空格(没有),然后读取/另存为
int
'4'
->
4

“%c”
:读取/保存1个字符,空格

:读取/丢弃空白(没有空白)。
“%c”
:读取/保存1个字符,即
“q”

'w'
保留在
stdin


如果未通过
“%c”
读取代码,请在说明符前面加空格。同时检查返回值

//              v
if (scanf("%d %d %c %c",&a,&b,&c,&d) == 4) Oh_Happy_Day();

空格是一个有效字符,因此它是readIt。它完全按照您告诉它的方式执行:读取int,space,int,char,space,char,输入的第一个字符是空格。另外一个字符只用于
Oh\u Happy\u Day()
//              v
if (scanf("%d %d %c %c",&a,&b,&c,&d) == 4) Oh_Happy_Day();