我最近在PC上运行c程序。它有一个for循环,其中扫描了一些字符。 for循环运行3次。在每次运行期间,它都会打印运行计数,然后扫描char d的值。程序如下
#include<stdio.h>
int main(){
int f;
char d;
for(f=0;f<3;f++){
printf("Choice %d\n", f);
scanf("%c", &d);
}
return 0;
}
现在麻烦是,当我运行程序时,当f为1时,for跳过scanf部分。现在,如果我按如下所示更改代码
#include<stdio.h>
int main(){
int f;
int d;
for(f=0;f<3;f++){
printf("Choice %d\n", f);
scanf("%d", &d);
}
return 0;
}
现在程序运行正常。并且forf循环的每次迭代都会执行scanf。
这里似乎是什么问题?我的意思是,当d的类型为int时,它可以正常工作,但是当d的类型为char时,它不能正常工作。
您必须更改
scanf("%c", &d);
to
scanf(" %c", &d);
^
|
否则,scanf()
将考虑先前输入的ENTER
按键。
注意:
[ENTER]]键会生成一个\n
,它是%c
格式说明符的有效输入。在%c
之前添加一个空格会告诉scanf()
忽略所有前导类似空格的输入(包括先前存储的\n
),并从stdin
中读取第一个非空白字符。
%d
格式说明符的情况,它在扫描数字输入之前会消耗(并忽略)任何前导类似空格的输入,因此第二种情况不会遇到任何问题。scanf("%c", &d);
的字符时,您按Enter键。该字符由scanf
占用,而换行符则保留在标准输入流(stdin
)中。下次调用scanf
(带有%c
)时,它会在\n
中看到stdin
字符并使用它,因此不再等待进一步的输入。