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

标签 c string

我看到了这个answer (你可以在那里使用 Ideone 中的小例子,它是等价的),所以我写了下面的函数来完成这项工作,但它会在读取小数位前的点时停止,并将 pi 视为 3 和 14。如何更改提取实数的代码?我不关心速度或内存使用情况,我只想完成工作。

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.

最佳答案

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

Interprets an integer value in a byte string pointed to by str.

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

对该例程进行了更多优化:

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

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

return strtof("NaN", NULL);

关于c - 如何从字符串中提取实数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31372363/

相关文章:

c - Windows 上的静态 libpixman-1.a 链接错误

c - 在 C 中的 .csv 文件中搜索

c# - 在 C# 中获取系统可空日期时间(日期时间?)的短日期

C# - 需要由一个且只有一个逗号分隔的字符格式的字符串

python - 从 JSON 文件访问特定值时出错

c - L值要求误差

C:指向函数中结构体数组的指针

c - C99 中与调整参数相关的未定义行为

c - 如何使用 scanf() 保存包含多个单词的字符串

python - 从分割句子中查找整数和字符串