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

时间:2010-01-04 05:00:23

标签: c

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

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

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

3 个答案:

答案 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;
}

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

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来控制容差。