如何确定c中的无效输入

时间:2014-08-09 20:20:22

标签: c input floating-point invalid-characters

我想要一个浮动输入但是如果用户输入一个字符输入它会显示无效输入,我没有在网上找到具体的答案。 怎么做?

2 个答案:

答案 0 :(得分:2)

考虑以下代码片段:

int num;
float val;

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

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

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

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

警告:不要在fflush上使用stdin

修改

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

  

123xyz

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

答案 1 :(得分:2)

虽然scanf可以安全地解析double,但许多编译器已经弃用了它(有充分理由),因为在解析字符串时它是不安全的。此外,如果解析失败,您将留下输入缓冲区中的遗骸,您将不得不自己冲洗它。

出于这些原因,更喜欢像fgets这样的函数,它检查其提供的缓冲区的长度,然后选择像strtodsscanf这样的函数来进行转换。

#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;
}