ZetCode

C strtold 函数

最后修改:2025 年 4 月 8 日

将字符串转换为数字是 C 编程中的一项常见任务,而 strtold 是将字符串转换为长双精度浮点数值的首选函数。本教程将深入探讨 strtold,包括其语法、用法和错误处理。我们将探讨实际示例,并讨论它为何比 atof 等替代方法更安全。理解 strtold 有助于创建能够正确处理数字输入的健壮程序。

什么是 strtold?

strtold 函数将字符串转换为长双精度浮点值。它在 stdlib.h 中声明,并提供健壮的错误处理。与 atof 不同,strtold 可以检测转换错误并支持不同的数字基数。它接受三个参数:要转换的字符串、一个用于存储结束位置的指针,以及可选的数字基数。在可靠的字符串到数字转换方面,请始终优先使用 strtold 而不是 atof

基本的 strtold 用法

此示例演示了使用 strtold 进行基本的字符串到长双精度浮点数转换。

basic_conversion.c
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *str = "3.14159265358979323846";
    char *endptr;
    long double value = strtold(str, &endptr);

    if (str == endptr) {
        printf("No conversion performed\n");
    } else {
        printf("Converted value: %.20Lf\n", value);
    }

    return 0;
}

在这里,strtold 将 pi 的字符串表示形式转换为长双精度浮点数。endptr 通过将其与原始字符串指针进行比较来帮助检测是否发生了转换。%.20Lf 的精度显示了长双精度浮点数的扩展精度。请务必检查 endptr 以验证转换是否成功。

使用 strtold 进行错误处理

此示例展示了使用 strtold 时的正确错误处理。

error_handling.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
    const char *str = "invalid123.45";
    char *endptr;
    errno = 0;
    long double value = strtold(str, &endptr);

    if (str == endptr) {
        printf("No digits were found\n");
    } else if (errno == ERANGE) {
        printf("Value out of range\n");
    } else {
        printf("Converted value: %Lf\n", value);
        printf("Remaining string: %s\n", endptr);
    }

    return 0;
}

此代码演示了使用 strtold 进行全面的错误检查。我们检查 errno 以了解范围错误,并检查 endptr 以了解转换成功。该示例故意使用了无效字符串来显示错误检测。处理用户输入或外部数据时,正确的错误处理至关重要。

十六进制浮点数转换

strtold 支持十六进制浮点表示法,如下所示。

hex_conversion.c
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *str = "0x1.8p1";  // 1.5 * 2^1 = 3.0
    char *endptr;
    long double value = strtold(str, &endptr);

    if (*endptr != '\0') {
        printf("Extra characters after number: %s\n", endptr);
    } else {
        printf("Hex float value: %Lf\n", value);
    }

    return 0;
}

此示例将十六进制浮点字符串转换为长双精度浮点数。格式 0x1.8p1 表示 1.5 (1 + 8/16) 乘以 2^1。十六进制浮点数在底层编程和精确指定值时很有用。endptr 检查可验证整个字符串是否已被解析。

本地化感知转换

此示例演示了使用 strtold 进行本地化感知数字转换。

locale_conversion.c
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main() {
    setlocale(LC_NUMERIC, "de_DE.UTF-8");
    const char *str = "1.234,56";  // German decimal format
    char *endptr;
    long double value = strtold(str, &endptr);

    if (*endptr != '\0') {
        printf("Conversion stopped at: %s\n", endptr);
    } else {
        printf("Locale-aware value: %'Lf\n", value);
    }

    return 0;
}

在此,strtold 尝试解析本地化特定的数字格式。请注意,标准的 strtold 通常期望句点作为小数点。为了获得完整的本地化支持,请考虑使用 strtod_l 或手动预处理。该示例显示了理解输入数字格式的重要性。

科学计数法转换

此示例展示了 strtold 如何处理科学计数法。

scientific_conversion.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
    const char *str = "-6.02214076e23";
    char *endptr;
    errno = 0;
    long double value = strtold(str, &endptr);

    if (errno == ERANGE) {
        printf("Value out of range\n");
    } else if (*endptr != '\0') {
        printf("Extra characters: %s\n", endptr);
    } else {
        printf("Avogadro's number: %Le\n", value);
    }

    return 0;
}

该代码将阿伏伽德罗常数从科学计数法转换为长双精度浮点数。%Le 格式说明符以科学计数法显示结果。strtold 正确处理符号、尾数和指数部分。对于较大的指数,使用 errno 进行范围检查尤其重要。

使用 strtold 的最佳实践

来源

C strtold 文档

本教程从基本用法到高级注意事项,全面介绍了 strtold 函数。在 C 程序中,正确的字符串到数字转换对于健壮的输入处理和数据处理至关重要。

作者

我的名字是 Jan Bodnar,我是一名敬业的程序员,对编码充满热情。自 2007 年以来,我通过 1,400 多篇文章和 8 本电子书分享我的专业知识。凭借十多年的教学经验,我致力于让编程变得平易近人且引人入胜。

列表 C 标准库