C中是否有函数检查输入是int
,long int
还是float
?我知道C有一个isdigit()
函数,我可以创建一个isnumeric
函数,如下所示:
int isnumeric( char *str )
{
while(*str){
if(!isdigit(*str))
return 0;
str++;
}
return 1;
}
但我想知道如何创建一个带浮点数(作为字符串)并输出TRUE / FALSE值的函数。
答案 0 :(得分:12)
这应该这样做。它使用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
和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
}
当然,更简化的方法是将值的类型和值一起返回。
答案 1 :(得分:0)
int isnumeric( char *str )
{
double d;
return sscanf(str, "%lf", &d);
}
答案 2 :(得分:0)
如果您的目标是查找给定字符串可以容纳的数据类型,您可以执行以下操作:
#include <stdlib.h>
#include <stdio.h>
#include <float.h>
#include <limits.h>
#include <errno.h>
#include <math.h>
/* 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
来控制容差。