首页 > 解决方案 > Scanf 在输入 Char 后跳过用户输入

问题描述

我有一段代码只要求用户输入并在用户输入 0 或更少时不断提示用户输入。

float n;

do {
    printf("Enter a number: ");
    scanf_s("%f", &n);
} while (n <= 0);

但是当用户输入一个 Char 时,它会一直执行 printf() 而不提示或等待用户输入。

我使用了带断点的 Visual Studio 调试器,发现在用户按下任何键的情况下执行了 scanf(),所以我不知道这里发生了什么。

标签: c

解决方案


您可能知道也可能不知道,scanf_s()返回成功转换并分配给变量的项目数。但是,当没有项目转换和分配成功时,它返回 0。

在您的情况下,scanf_s()需要浮动。因此,当char输入 a 时,它与转换说明符不匹配并失败。结果,scanf_s()返回 0。

此外,字符不会被消耗并保留在输入缓冲区中。所以scanf_s()将继续在同一个字符上失败并无限循环。

解决方案

scanf_s()1) 检查失败的返回值。

2) 失败时消耗所有未读字符。

建议

1)初始化您的变量n,因为即使 scanf_s() 失败也会对其进行评估。

2)由于您希望用户输入大于0的数字,因此在提示输入时要特别说明。

代码

float n = 0; /* initialize the variable */

do {
    printf("Enter a number greater than 0: ");
    if (scanf_s("%f", &n, 1) != 1)
        while (getchar() != '\n'); /* consume any unread characters */
} while (n <= 0);

推荐阅读