C 语言标准库(三)

person c猿人    watch_later 2024-09-21 21:32:46
visibility 230    class setjmp,stdbool,stdint,complex    bookmark 专栏

当然,除了之前介绍的常用标准库,C 标准库还包含了其他功能丰富的库,涵盖更多特定领域的功能。以下是一些未介绍的标准库及其关键功能。


1. <locale.h> —— 本地化库

<locale.h> 提供了支持区域设置(locale)的功能,使程序能够根据用户所在的地理区域或语言环境来处理日期、时间、货币等数据格式。

1.1 常用函数

  • char *setlocale(int category, const char *locale):设置或获取当前的区域设置。
    • category 可选:LC_ALL(所有类别)、LC_TIME(时间格式)、LC_NUMERIC(数字格式)等。
  • struct lconv *localeconv(void):返回指向当前区域设置的货币格式信息的指针。

示例:设置区域设置

#include <stdio.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, "en_US.UTF-8"); // 设置区域为美国
    printf("区域设置为美国: %s\n", setlocale(LC_ALL, NULL));
  
    setlocale(LC_ALL, ""); // 恢复系统默认区域
    printf("恢复系统默认区域: %s\n", setlocale(LC_ALL, NULL));
  
    return 0;
}

2. <stddef.h> —— 标准定义库

<stddef.h> 定义了标准的宏和类型,帮助在指针、大小等方面进行统一处理,许多其他标准库函数中也常用到这些定义。

2.1 常用类型

  • size_t:无符号整数类型,表示对象的大小,常由 sizeof 返回。
  • ptrdiff_t:有符号整数类型,表示指针间的差值。
  • NULL:空指针常量。

2.2 常用宏

  • offsetof(type, member):返回结构体 member 成员相对于结构体开头的偏移量。

示例:使用 offsetof

#include <stdio.h>
#include <stddef.h>

struct Example {
    int a;
    double b;
    char c;
};

int main() {
    printf("成员 a 的偏移量: %zu\n", offsetof(struct Example, a));
    printf("成员 b 的偏移量: %zu\n", offsetof(struct Example, b));
    printf("成员 c 的偏移量: %zu\n", offsetof(struct Example, c));
    return 0;
}

3. <complex.h> —— 复数库

<complex.h> 是 C99 标准引入的,用于处理复数类型的运算。它定义了复数的类型及一系列与复数相关的函数。

3.1 常用类型和宏

  • double complex:双精度复数类型。
  • I:虚数单位,用于表示复数中的虚部。

3.2 常用函数

  • double creal(double complex z):返回复数的实部。
  • double cimag(double complex z):返回复数的虚部。
  • double complex cadd(double complex z1, double complex z2):复数相加。
  • double complex cmul(double complex z1, double complex z2):复数相乘。

示例:复数运算

#include <stdio.h>
#include <complex.h>

int main() {
    double complex z1 = 1.0 + 2.0 * I; // 定义复数 z1
    double complex z2 = 1.0 - 1.0 * I; // 定义复数 z2

    double complex sum = z1 + z2; // 复数相加
    double complex product = z1 * z2; // 复数相乘

    printf("z1 + z2 = %.2f + %.2fi\n", creal(sum), cimag(sum));
    printf("z1 * z2 = %.2f + %.2fi\n", creal(product), cimag(product));

    return 0;
}

4. <stdint.h> —— 定长整数类型库

<stdint.h> 提供了在不同平台上具有一致性和确定大小的整数类型。它定义了标准的定长整数类型,如 int8_tuint32_t 等,确保跨平台的可移植性。

4.1 常用类型

  • int8_t:8 位有符号整数。
  • uint8_t:8 位无符号整数。
  • int16_tuint16_t:16 位有符号/无符号整数。
  • int32_tuint32_t:32 位有符号/无符号整数。
  • int64_tuint64_t:64 位有符号/无符号整数。

4.2 常用宏

  • INT8_MAXINT16_MAXINT32_MAXINT64_MAX:有符号整数的最大值。
  • UINT8_MAXUINT16_MAXUINT32_MAXUINT64_MAX:无符号整数的最大值。

示例:使用定长整数类型

#include <stdio.h>
#include <stdint.h>

int main() {
    int8_t a = 127; // 最大值为 127
    uint16_t b = 65535; // 无符号 16 位整数

    printf("int8_t a = %d\n", a);
    printf("uint16_t b = %u\n", b);

    return 0;
}

5. <stdbool.h> —— 布尔类型库

<stdbool.h> 提供了布尔类型 bool,以及布尔常量 truefalse。虽然在 C 中 0 代表假,非 0 代表真,但 stdbool.h 提供了更易读的布尔值语义。

5.1 布尔类型和常量

  • bool:布尔类型。
  • true:布尔真值,等价于 1
  • false:布尔假值,等价于 0

示例:布尔值的使用

#include <stdio.h>
#include <stdbool.h>

int main() {
    bool flag = true;

    if (flag) {
        printf("flag 为 true\n");
    } else {
        printf("flag 为 false\n");
    }

    return 0;
}

6. <float.h> —— 浮点数库

<float.h> 定义了各种浮点类型的精度、最小值和最大值等常量。对于处理浮点数的极限值及其精度控制非常有用。

6.1 常用宏

  • FLT_MAXDBL_MAXfloatdouble 类型的最大值。
  • FLT_MINDBL_MINfloatdouble 类型的最小正值。
  • FLT_EPSILONDBL_EPSILON:浮点数 1.0 与比 1.0 大的最小浮点数之差。

示例:获取浮点数的最大和最小值

#include <stdio.h>
#include <float.h>

int main() {
    printf("float 最大值: %e\n", FLT_MAX);
    printf("double 最小值: %e\n", DBL_MIN);
    printf("float 精度: %e\n", FLT_EPSILON);

    return 0;
}

7. <setjmp.h> —— 非局部跳转

<setjmp.h> 提供了跨越函数调用的非局部跳转机制,通常用于异常处理。主要函数包括 setjmplongjmp

7.1 常用函数

  • int setjmp(jmp_buf env):保存当前的程序状态。
  • void longjmp(jmp_buf env, int val):恢复 setjmp 保存的状态,继续执行。

示例:使用 setjmplongjmp 处理异常

#include <stdio.h>
#include <setjmp.h>

jmp_buf buf;

void error_recovery() {
    printf("发生错误,进行恢复...\n");
    longjmp(buf, 1); // 跳转回主函数
}

int main() {
    if (setjmp(buf)) {
        printf("程序恢复执行\n");
    } else {
        printf("开始正常执行\n");
        error_recovery(); // 模拟错误发生
    }
    return 0;
}

8. <errno.h> —— 错误号库

<errno.h> 提供了处理标准库函数错误的机制,使用全局变量 errno 来记录最近发生的错误码,并提供函数 strerror 将错误码转换为对应的错误消息。

8.1 常用变量和函数

  • int errno:存储最近发生的错误码。
  • `

char *strerror(int errnum):返回与错误码 errnum` 对应的错误消息。

  • void perror(const char *s):打印标准错误信息,通常用于输出系统调用失败时的错误原因。

示例:文件操作错误处理

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *fp = fopen("nonexistent.txt", "r");

    if (fp == NULL) {
        perror("文件打开失败"); // 打印标准错误信息
        printf("错误码: %d\n", errno);
        printf("错误消息: %s\n", strerror(errno));
    }

    return 0;
}

这些库函数在不同场景下大大提升了 C 语言程序的灵活性和功能性,让开发者能够处理各种特殊需求。

评论区
评论列表
menu