我最近在我的电脑上运行了一个c程序。它有一个for循环,其中扫描了一些char。 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时,跳过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类型时它无法正常工作。
答案 0 :(得分:9)
你必须改变
scanf("%c", &d);
到
scanf(" %c", &d);
^
|
否则,scanf()
会考虑先前输入的ENTER
按键。
注意:
ENTER 按键生成\n
,这是%c
格式说明符的虚拟输入。在%c
之前添加空格告诉scanf()
忽略所有前导空格类型的输入(包括先前存储的\n
)并从stdin
读取第一个非空白字符。< / p>
对于%d
格式说明符的情况,它在扫描数字输入之前消耗(并忽略)任何前导类空白输入,因此第二种情况不会出现任何问题。
答案 1 :(得分:2)
问题是,当您为scanf("%c", &d);
输入字符时,请按Enter键。该字符由scanf
使用,换行符保留在标准输入流(stdin
)中。当下次调用scanf
(带%c
)时,它会在\n
中看到stdin
字符并使用它,因此不会等待进一步输入。< / p>
要解决此问题,请更改
scanf("%c", &d);
到
scanf(" %c", &d);
// ^Note the space before %c
%c
之前的空格指示scanf
扫描任意数量的空白字符(包括无字符),并在遇到非空白字符时停止扫描。引用标准:
7.21.6.2 fscanf功能
[...]
- 由白色空格字符组成的指令通过读取输入来执行 第一个非空格字符(仍未读取),或直到不再有字符 被阅读。该指令永远不会失败。
醇>
使用%d
工作的原因是%d
格式说明符会自动跳过空格字符,而\n
是空白字符,%d
不会扫描它。再次引用标准:
7.21.6.2 fscanf功能
[...]
- 跳过输入空白字符(由
醇>isspace
函数指定),除非 该规范包括[
,c
或n
说明符。 284