如何从字符串中提取实数?

时间:2015-07-12 20:41:03

标签: c string

我看到了这个answer(你可以在Ideone中使用次要的例子,它是等价的),所以我写了下面的函数来完成这项工作,但是在读取之前它会停止十进制数字,将像3和14一样对待pi。如何更改代码以提取实数?我不关心速度或内存使用情况,我只是想做这个工作。

float extract_number(char* str) {
    char* p = str;
    while (*p) {
        if (isdigit(*p)) {
            long val = strtol(p, &p, 10);
            printf("%ld\n", val);
            return val;
        } else {
            p++;
        }
    }
    return -1.0;
}

以下是我正在使用的str

Initializing data structure(s) took 149.898690000 seconds wall clock time.

2 个答案:

答案 0 :(得分:2)

就个人而言,我喜欢sscanf进行字符串解析:

double extract_number(char* str) {
  double x;
  int result = sscanf (str, "%lf", &x);
  if (result != 1)
    return -1.0;
  return x;
}

注:

如果要分离浮点值的整数部分和小数部分,请查看modf()

答案 1 :(得分:2)

strtol将文字转换为long,而不是float。来自strtol

  

解释str指向的字节字符串中的整数值。

使用strtofstrtod转换为floatdouble。原型使用第二个参数,通常称为endptr,它是一个char *,它将被更新为指向第一个未转换的字符,但由于你不需要它,你可以设置它到NULL

对该例程进行了几次优化:

  1. 您可以安全地修改参数*str
  2. 不需要中间值,您可以返回strtof
  3. 的结果
  4. 在明确的else
  5. 之后无需return
  6. 如果值-1.0f是可能的有效返回值,则应使用NAN
  7. float extract_number (char* str)
    {
        while (*str)
        {
            if (isdigit(*str))
            {
                return strtof(str, NULL);
            }
            str++;
        }
        return NAN;
    }
    

    要返回NAN,您需要包含math.h,但这是一个相当新的补充(显然,之前有遗漏!)所以它可能在您的系统中不可用。如果不是,请使用这个完全邪恶的黑客(荣誉J.Kraftcheck's answer here):

    return strtof("NaN", NULL);