我最近在我的电脑上运行了一个c程序。它有一个 for 循环,其中扫描了一些字符 d。for 循环运行 3 次。在每次运行期间,它会打印正在运行的计数,然后扫描字符 d 的值。程序如下
#include<stdio.h>
int main(){
int f;
char d;
for(f=0;f<3;f++){
printf("Choice %dn", 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 %dn", f);
scanf("%d", &d);
}
return 0;
}
现在程序工作正常。 并且 scanf 为 for 循环的每次迭代执行。
这里似乎有什么问题?我的意思是当 d 是 int 类型时它可以正常工作,但是当 d 是 char 类型时,它无法正常工作。
你必须改变
scanf("%c", &d);
自
scanf(" %c", &d);
^
|
否则,scanf()
将考虑之前输入的ENTER
按键。
注意:
ENTER 键生成一个
n
,这是%c
格式说明符的有效输入。在%c
之前添加一个空格告诉scanf()
忽略所有类似空格的前导输入(包括以前存储的n
输入(,并从stdin
中读取第一个非空格字符。至于
%d
格式说明符的情况,它会在扫描数字输入之前消耗(并忽略(任何类似空格的前导输入,因此第二种情况不会遇到任何问题。
问题是当你输入一个字符时 scanf("%c", &d);
,你按回车键。该字符由scanf
使用,换行符保留在标准输入流( stdin
(。下次调用scanf
(带 %c
(时,它会在stdin
中看到n
字符并使用它,因此不会等待进一步的输入。
要修复它,请更改
scanf("%c", &d);
自
scanf(" %c", &d);
// ^Note the space before %c
%c
前面的空格指示scanf
扫描任意数量的空格字符(包括 none(,并在遇到非空格字符时停止扫描。引用标准:
7.21.6.2 fscanf 函数
[...]
- 由空格字符组成的指令通过读取输入来执行,最高可达 第一个非空格字符(保持未读状态(,或者直到没有更多字符可以 被阅读。该指令永远不会失败。
使用 %d
起作用的原因是 %d
格式说明符会自动跳过空格字符,并且由于n
是空格字符,因此%d
不会扫描它。再次引用标准:
7.21.6.2 fscanf 函数
[...]
- 跳过输入空格字符(由
isspace
函数指定(,除非 规范包括[
、c
或n
说明符。284