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

时间:2017-08-04 14:12:17

标签: 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 qw

所以我期待我的输出是:

    5*4* *

输出:

    5*4* *q

有人可以解释一下为什么它只考虑两个空格中的一个(5和4之间的那个和4和q之间的另一个)作为一个角色,而不是两个空格?这两个空白中的哪一个被打印成一个角色?

3 个答案:

答案 0 :(得分:2)

如果我们从

开始
scanf("%d %d",&a,&b);

然后会读取54,将输入缓冲区保留为" qw"

现在你做的时候

scanf("%c %c",&c,&d);

第一个"%c"读取空间,而另一个读取'q''w'将保留在输入缓冲区中。

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

如果您阅读例如this scanf (and family) reference您会看到"%c""%[""%n"格式会丢弃领先的空白区域。

答案 1 :(得分:2)

考虑

scanf("%d %d%c %c",&a,&b,&c,&d);
// input "5 4 qw"

"%d":读取/丢弃前导空格(没有),然后读取/保存为int '5' - &gt; 5
" ":读取/丢弃空格(1个空格:' '"%d":读取/丢弃前导空格(没有),然后读取/保存为int '4' - &gt; 4
"%c":读取/保存1个字符,空格' ' " ":读取/丢弃空格(没有) "%c":读取/保存1个字符'q'

'w'仍在stdin

如果代码未通过"%c"读取空格,则在说明符前面加一个空格。还要检查返回值。

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

答案 2 :(得分:1)

使用%d时,scanf会查找一个数字并忽略这些空格,但%c之前的空格不会被忽略。