C:扫描字符未按预期工作



我最近在我的电脑上运行了一个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按键。

注意:

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

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

[...]

  1. 由空格字符组成的指令通过读取输入来执行,最高可达 第一个非空格字符(保持未读状态(,或者直到没有更多字符可以 被阅读。该指令永远不会失败。

使用 %d 起作用的原因是 %d 格式说明符会自动跳过空格字符,并且由于n是空格字符,因此%d不会扫描它。再次引用标准:

7.21.6.2 fscanf 函数

[...]

  1. 跳过输入空格字符(由 isspace 函数指定(,除非 规范包括[cn说明符。284

最新更新