如何在c中检查用户输入的数据类型,如int、double和string

如何在c中检查用户输入的数据类型,如int、double和string,c,C,我试图检查用户输入的数据类型,可以是int、double、string/char等。以下是我的代码: int main(void) { char input[100] = ""; double x; int num; char str[20] = ""; int assignments[5] = { 0 }; printf("Pls. provide unput"); fgets(input, 100, stdin); if (

我试图检查用户输入的数据类型,可以是int、double、string/char等。以下是我的代码:

int main(void)
{
    char input[100] = "";
    double x;
    int num;
    char str[20] = "";
    int assignments[5] = { 0 };

    printf("Pls. provide unput");
    fgets(input, 100, stdin);

    if (sscanf(input, "%d", &num) == 1)
    {
        printf("the input is a int.\n");
    }
    else if (strtod(input, NULL) != 0)
    {
        printf("the input is a double\n");
    }
    else if (sscanf(input, "%s", &str) == 1)
    {
        printf("the input is a string\n");
    }
    else
    {
        printf("input not recognized");
    }

    return 0;
}
但是它不能正常工作-特别是
double
部分。对于
double
的任何输入,它将其识别为
int

  • 当您扫描字符数组时,不需要地址“str”而不是“&str”,字符数组将衰减为指针
  • 现在来谈谈你为什么会遇到麻烦的主要问题。请记住,所有整数也是双精度/浮点数。i、 e整数是浮点的完美子集。所以,如果您首先检查整型/读入整型变量,您将始终匹配任何浮点,因为用户输入的浮点在读取时将被截断为整型,因此您将永远不会执行双精度分支检查

    解决这个问题的方法是首先测试浮点数。因此,将输入读入double,然后如果它是真的,您可以通过将它转换为整数并查看相对差来测试它是否是整数,以查看它是否小于某个公差

    下面可以看到修复此问题的代码

    #include "stdio.h"
    #include "stdlib.h"
    #include "math.h"
    
    
    int main()
    {
       char input[100] = "";
       double x;
       int num;
       char str[20] = "";
       int assignment[5] = {0};
       double tolerance = 1e-12;
    
       printf("Pls. provide input: ");
       fgets(input, 100, stdin);
    
       if (sscanf(input, "%lf", &x) == 1) { 
          // Is it a number? All integers are also doubles.
          num = (int)x; // We cast to int. 
          if ( fabs(x - num)/x > tolerance ) {
             printf("The input is a floating point\n");
          } else { 
             printf("The input is a integer\n");
          }
       } else if (sscanf(input, "%s", str) == 1) { 
          // Check if it is string
          printf("The input is a string\n");
       } else { 
          // No match error.
          printf("input not recognized\n");
       }
    }
    
    样本

    gcc测试c

    请。提供输入:3
    输入是一个整数

    请。提供输入:3.3
    输入是一个浮点


    注意您应该使用一些更有意义的东西,比如机器精度,而不是我显示的公差。

    毫不奇怪,代码会将浮点值的输入检测为
    int
    。例如,给定
    2.3
    的输入,
    sscanf()
    %d
    格式将把
    2
    识别为
    int
    ,并在遇到小数点时停止。小数点将被随后的输入操作读取

    尝试处理该字符串以检查该字符串包含的内容。可以使用的条件包括查找非数字字符(除数字、小数点或符号字符以外的任何字符)-如果找到这些字符,则将输入视为字符串。如果只找到数字和符号字符,但没有小数点,则将字符串解释为
    int
    。如果找到了数字、符号和小数点,则解释为
    浮点

    例如,如果希望将
    2.3E32
    视为浮点而不是字符串,则还可以使用其他技术

    您可以根据自己的需要,随心所欲地定制上述产品


    然而,无论您做什么,都需要对每个操作(读取、解释字符串等)进行错误检查。你最好假设输入字符串包含垃圾,除非它通过了你的测试-默认情况下假设它包含一个整数可能会让你在输入时遇到麻烦,比如
    2XYZ

    @SouravGhosh integer可以正确地读作
    double
    @BLUEPIXY我明白你的意思了,直截了当地说,但是如果您坚持使用
    abc.xyz
    格式,则
    %d.%d
    可以用于double.)双重身份为
    3.1e2
    inf
    。@BLUEPIXY这就是我提到格式的原因:)strtod(“123”,&endp),endp-->'\0',但int。你一定看到过这个问题的一个非常早期的版本,它在第一个5分钟内就被修复了,以便看到
    scanf()
    格式错误-问题历史记录中没有这方面的记录(但如果在添加评论之前已修复,则不会有记录)。好的,我已编辑以反映这一点。但是问题作者发布的原始代码仍然存在错误,他使用了&str而不是str。你提供的东西好多了。我不太确定最好做什么。像
    strtod()
    strtol()
    这样的函数会告诉您它们停止转换的位置以及是否检测到错误,并且您可以使用结束位置扫描到行尾,以确保所有内容都已转换,然后您可以先尝试整数,然后再尝试双倍。但是,使用
    strtol()
    strtod()进行错误检测是一件棘手的事情,这是我还不确定它是否适合OP的一个主要原因。替代方案也很糟糕。也许转换规范有帮助?