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键。

注意:

  1. ENTER键生成一个\n ,这是%c格式说明符的vaild输入。 在%c之前添加空格告诉scanf()忽略所有前导空格类型的输入(包括先前存储的\n )并从stdin读取第一个非空白字符。

  2. 对于%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函数

[…]

  1. 由白色空格字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。 该指令永远不会失败。

使用%d工作的原因是%d格式说明符会自动跳过空格字符,因为\n是空白字符, %d不会扫描它。 再次引用标准:

7.21.6.2 fscanf函数

[…]

  1. 除非规范包含[cn说明符,否则将跳过输入的空白​​字符(由isspace函数指定)。 284