2017-08-04 73 views
2

我想了解输入缓冲区如何工作。所以我写了一段代码:为什么在输入缓冲区中只有一个(两个)空白字符被认为是字符?

#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之间)是一个字符而不是它们两个?两个空格中的哪一个被打印为字符?

+0

的空间是一个有效字符,因此被读取 –

+0

它做的正是你告诉它:读取INT,空间,INT,焦炭,空间,字符,第一个字符是在你输入一个空格。 –

回答

2

考虑

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(); 
+0

加上一个'Oh_Happy_Day()' –

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

随着%dscanf寻找一个数字,忽略空格,但与%cq之前的空间也是不可忽视的。

相关问题