我试图了解输入缓冲区的工作原理。所以我写了一段代码:
#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 :(得分:2)
如果我们从
开始scanf("%d %d",&a,&b);
然后会读取5
和4
,将输入缓冲区保留为" 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
之前的空格不会被忽略。