C atof()函数的替代方法,用于将输入0与故障进行差异化

C atof()函数的替代方法,用于将输入0与故障进行差异化,c,floating-point,atof,C,Floating Point,Atof,我创建了一个函数来验证实数的输入。它工作正常,但由于atof()函数在失败时返回0,因此无法输入0。有人能帮助解决这个问题吗 float validate_float() { float num; char str[8]; do { printf("enter a float number:"); fflush(stdin); gets(str); num=atof(str); } w

我创建了一个函数来验证实数的输入。它工作正常,但由于
atof()
函数在失败时返回
0
,因此无法输入
0
。有人能帮助解决这个问题吗

float validate_float()
{
    float num;
    char str[8];
    do
    {
        printf("enter a float number:");
        fflush(stdin);
        gets(str);
        num=atof(str);
    }
    while(num==0);
    return num;
}

是的,这是对
atof()
的限制

你可以利用/代替

Syantax:

double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);
注意:要区分实际输入
0
和无转换
0
,需要检查
endptr


话虽如此,正如其他人也提到的

  • 不要使用
    fflush(stdin)
    。它调用
  • 永远不要使用
    gets()
    ,它可能会出现缓冲区溢出。改用

    • 这是标准化的
      atof
      的一个众所周知的限制。若要绕过此限制,请改用
      strtod
      ,并为第二个参数传递一个非空指针

      从我的系统的手册页:

      双重的 strtod(常量字符*限制nptr,字符**限制endptr)

      如果endptr不为NULL,则为指向最后一个字符后的字符的指针 转换中使用的数据存储在endptr引用的位置

      如果未执行任何转换,则返回零,且nptr的值为 存储在endptr引用的位置

    • 不要
      fflush()
      stdin
      这是未定义的行为

    • 很简单,就用这个

      int isfloat(const char *value)
       {
          char *endptr;
          float num; 
          num = strtof(str, &endptr);
          if (*endptr != '\0')
              return 0;
          return 1;
       }
      

    • 因此,您的问题是,您应该如何绕过
      atof
      的限制?我建议将
      置于while(num==0)
      与右大括号
      }
      位于同一行,因为您在这里遇到的情况会让人误以为您在运行无限循环时有一个流浪的
      。我有一个变量,它应该只接受-10到15之间的浮点值,包括0。但是我想验证数据输入,以便用户输入一个字母,程序不会崩溃。谢谢:)!我找到了这个函数,可以很好地用于:)。int-isfloat(char*str){double num;返回sscanf(str,“%f”,&num);}