检查输入字符串是整数还是浮点数的函数?

C中是否有一个函数来检查输入是intlong int还是float ? 我知道C有一个isdigit()函数,我可以创建一个isnumeric函数,如下所示:

 int isnumeric( char *str ) { while(*str){ if(!isdigit(*str)) return 0; str++; } return 1; } 

但我想知道如何创建一个将浮点数(作为字符串)并输出TRUE / FALSE值的函数。

这应该做到这一点。 它使用strtod将字符串转换为浮点数,并检查后面是否还有其他输入。

 int isfloat (const char *s) { char *ep = NULL; double f = strtod (s, &ep); if (!ep || *ep) return false; // has non-floating digits after number, if any return true; } 

区分float s和int是比较棘手的。 正则表达式是一种方法,但我们可以检查浮动字符:

 int isfloat (const char *s) { char *ep = NULL; long i = strtol (s, &ep); if (!*ep) return false; // it's an int if (*ep == 'e' || *ep == 'E' || *ep == '.') return true; return false; // it not a float, but there's more stuff after it } 

当然,更简化的方法是将值的类型和值一起返回。

 int isnumeric( char *str ) { double d; return sscanf(str, "%lf", &d); } 

如果您的目标是找到给定字符串可以容纳的数据类型,您可以执行以下操作:

 #include  #include  #include  #include  #include  #include  /* If a floating-point number is +/- F_EPS from an integer, consider it to be an integer */ #define F_EPS 1e-7 enum datatype { TYPE_INT, TYPE_LONG, TYPE_FLOAT, TYPE_DOUBLE, TYPE_INVALID }; enum datatype findtype(const char *s) { char *eptr; double d; double diff; errno = 0; d = strtod(s, &eptr); if ((d == 0 && eptr == s) || errno == ERANGE) return TYPE_INVALID; diff = d - floor(d+0.5); if (d <= INT_MAX && d >= INT_MIN && diff <= F_EPS) return TYPE_INT; if (d <= LONG_MAX && d >= LONG_MIN && diff <= F_EPS) return TYPE_LONG; if ((d > 0 && (d > FLT_MAX || d < FLT_MIN)) || (d < 0 && (d < -FLT_MAX || d > -FLT_MIN))) return TYPE_FLOAT; return TYPE_DOUBLE; } 

这个想法是你将数字读作double精度数,然后检查它是否在不同类型的范围内。 您可以更改上面的F_EPS来控制公差。