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