我创建了一个函数来验证实数的输入。它运行良好,但由于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;
}
答案 0 :(得分:4)
是的,这是atof()
的限制。
<强> 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)
不要fflush()
stdin
未定义的行为。
很简单,只需使用此
即可int isfloat(const char *value)
{
char *endptr;
float num;
num = strtof(str, &endptr);
if (*endptr != '\0')
return 0;
return 1;
}