替代atof()函数来区分输入0与失败

时间:2015-05-27 11:48:59

标签: 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);
    }
    while(num==0);
    return num;
}

3 个答案:

答案 0 :(得分:4)

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

您可以改用strtof() / strtod()

<强> Syantax:

double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);

注意:要区分实际输入 0无转化 0,您需要检查endptr

现在说,正如其他人所说,

  • 请勿使用fflush(stdin)。它调用undefined behaviour
  • 从不使用gets(),它可能会遇到缓冲区溢出问题。请改用fgets()

答案 1 :(得分:1)

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

从我系统的手册页:

  

双        strtod(const char * restrict nptr,char ** restrict endptr);

     

...

     

如果endptr不是NULL,则指向最后一个字符后面的字符        转换中使用的内容存储在endptr。

引用的位置      

如果未执行转换,则返回零并且nptr的值为        存储在endptr。

引用的位置

答案 2 :(得分:0)

  1. 不要fflush() stdin未定义的行为。

  2. 很简单,只需使用此

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