-5

我想采用浮点输入,但如果用户输入字符,它将显示无效输入,我没有在网上找到具体答案。它是如何完成的?

4

2 回答 2

2

考虑以下代码片段:

int num;
float val;

num = scanf("%f", &val);
if(num != 1)
{
    printf("You didn't enter a float!\n");
}

scanf返回它成功扫描的项目数。在您的情况下,您正在尝试扫描一个项目,一个float. 如果用户不输入 a floatscanf将返回0

注意:如果scanf失败,用户输入的任何垃圾数据仍将在stdin流中。您必须手动冲洗它。这是一种这样的方式:

while(((ch = getchar()) != '\n') && (ch != EOF))
    continue;

警告:不要fflushstdin.

编辑

即使scanf没有失败,stdin缓冲区中可能仍有垃圾。例如,如果用户输入:

123xyz

123将分配给浮点数,之后的所有内容都x将保留在stdin流中。

于 2014-08-09T20:52:05.027 回答
2

虽然scanf解析 double 是安全的,但许多编译器已弃用它(有充分的理由),因为它在解析字符串时是不安全的。此外,如果解析失败,您将在输入缓冲区中留下剩余部分,您必须自己刷新它。

由于这些原因,更喜欢使用类似 的函数fgets来检查其提供的缓冲区的长度,然后使用类似strtodor的函数sscanf来进行转换。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char buf[64];

    /* read */
    if (fgets(buf, sizeof buf, stdin)) {
        /* convert */
        char *err;
        double d = strtod(buf, &err);
        if (*err) {
            puts("entry invalid");
        } else {
            printf("you entered %lf", d);
        }
    }

    return 0;
}
于 2014-08-09T21:03:25.587 回答