如何确定c语言中的无效输入

如何确定c语言中的无效输入,c,input,floating-point,invalid-characters,C,Input,Floating Point,Invalid Characters,我想接受浮点输入,但如果用户输入字符,它将显示无效输入,我在网上没有找到具体答案。 它是如何完成的?考虑以下代码片段: int num; float val; num = scanf("%f", &val); if(num != 1) { printf("You didn't enter a float!\n"); } scanf返回它成功扫描的项目数。在你的例子中,你试图扫描一个项目,一个浮动。如果用户未输入浮点值,scanf将返回0 注意:如果scanf失败,用户输入的垃

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

考虑以下代码片段:

int num;
float val;

num = scanf("%f", &val);
if(num != 1)
{
    printf("You didn't enter a float!\n");
}
scanf返回它成功扫描的项目数。在你的例子中,你试图扫描一个项目,一个浮动。如果用户未输入浮点值,scanf将返回0

注意:如果scanf失败,用户输入的垃圾数据仍将在stdin流中。你必须手动冲洗它。这里有一种方法:

while(((ch = getchar()) != '\n') && (ch != EOF))
    continue;
警告:不要在标准DIN上使用fflush

编辑

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

123xyz

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

虽然scanf可以安全地解析double,但许多编译器出于充分的理由不推荐使用它,因为它在解析字符串时不安全。此外,如果解析失败,您将保留输入缓冲区中的剩余部分,您必须自己刷新它

出于这些原因,我们更喜欢使用fgets这样的函数来检查其提供的缓冲区的长度,然后使用strtod或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;
}

一个好的开始是在你最喜欢的搜索引擎(又名谷歌)上输入scanf。像123xyz这样的输入是有效的吗?每个人都建议scanf,因为scanf解析double不是“天生”不安全的。好吧,50%的scanf建议答案都建议scanf,因为scanf不是天生不安全的。@PascalCuoq:是的,很公平:解析一个数字,但我仍然不会使用/教授它。我删除了那个位{是一个问题,但方向正确。fgets通常会得到一个以\n\0结尾的字符串,然后*err将在其中包含“\n”。可能在if?输入之前添加isspace*err err++,例如123xyz是有效的?@SHR 123是有效的,但是xyz是无效的,并保留在stdin流中。您需要手动刷新它,因为它可能会被意外使用在另一个从stdin获取数据的函数调用中。为什么stdin上的fflush会产生问题?@Jimut fflush仅用于输出流,例如stdout.Minor:whilegetchar!='\n'->EOF上的无限循环。