C:scanf for char无法正常工作
我最近在我的电脑上运行了ac程序。 它有一个for循环,其中扫描一些char。 for循环运行3次。 在每次运行期间,它打印运行计数,然后扫描char d的值。 该计划如下
#include 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 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);
至
scanf(" %c", &d); ^ |
否则, scanf()
会考虑先前输入的ENTER
键。
注意:
-
按ENTER键生成一个
\n
,这是%c
格式说明符的vaild输入。 在%c
之前添加空格告诉scanf()
忽略所有前导空格类型的输入(包括先前存储的\n
)并从stdin
读取第一个非空白字符。 -
对于
%d
格式说明符的情况,它在扫描数字输入之前消耗(并忽略)任何前导类空格输入,因此第二种情况不会出现任何问题。
问题是当你为scanf("%c", &d);
输入一个字符时scanf("%c", &d);
,按下回车键。 该字符由scanf
消耗,换行符保留在标准输入流( stdin
)中。 当下次调用scanf
(带有%c
)时,它会看到stdin
的\n
字符并使用它,因此不会等待进一步的输入。
要修复它,请更改
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函数
[…]
- 除非规范包含
[
,c
或n
说明符,否则将跳过输入的空白字符(由isspace
函数指定)。 284