- c语言学习计划
- C语言简介
- C语言基本语法
- C语言-控制结构
- C语言-输入输出
- C语言-数组和字符串
- C语言函数详解
- C语言指针详解
- 结构体和联合体
- C语言高级特性和内存管理
- c语言文件操作
- C 语言标准库
- C 语言标准库(二)
- C 语言标准库(三)
- C 语言标准库(四)
- C 语言标准库(五)
C 语言标准库(三)
class setjmp,stdbool,stdint,complex当然,除了之前介绍的常用标准库,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_t、uint32_t 等,确保跨平台的可移植性。
4.1 常用类型
int8_t:8 位有符号整数。uint8_t:8 位无符号整数。int16_t、uint16_t:16 位有符号/无符号整数。int32_t、uint32_t:32 位有符号/无符号整数。int64_t、uint64_t:64 位有符号/无符号整数。
4.2 常用宏
INT8_MAX、INT16_MAX、INT32_MAX、INT64_MAX:有符号整数的最大值。UINT8_MAX、UINT16_MAX、UINT32_MAX、UINT64_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,以及布尔常量 true 和 false。虽然在 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_MAX、DBL_MAX:float和double类型的最大值。FLT_MIN、DBL_MIN:float和double类型的最小正值。FLT_EPSILON、DBL_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> 提供了跨越函数调用的非局部跳转机制,通常用于异常处理。主要函数包括 setjmp 和 longjmp。
7.1 常用函数
int setjmp(jmp_buf env):保存当前的程序状态。void longjmp(jmp_buf env, int val):恢复setjmp保存的状态,继续执行。
示例:使用 setjmp 和 longjmp 处理异常
#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 语言程序的灵活性和功能性,让开发者能够处理各种特殊需求。
评论区
评论列表