C 标准库 - 快速指南
C 库 - <assert.h>
C 标准库的 assert.h 头文件提供了一个名为 assert 的宏,该宏可用于验证程序所做的假设,并在假设不成立时打印诊断消息。
定义的宏 assert 引用了另一个宏 NDEBUG,而该宏不属于 <assert.h>。如果源文件中将 NDEBUG 定义为宏名,则在 <assert.h> 所在的位置包含后,assert 宏定义如下 -
#define assert(ignore) ((void)0)
库宏
以下是头文件 assert.h 中定义的唯一函数 -
Sr.No. | 函数 &说明 |
---|---|
1 |
void assert(int expression)
这实际上是一个宏,而不是函数,可用于在 C 程序中添加诊断信息。 |
2 |
static_assert(boolean_expression, message)
如果常量表达式的值为 false,则此宏会发出编译时诊断信息。 |
C Library - <ctype.h>
C 标准库的 ctype.h 头文件声明了几个用于测试和映射字符的函数。
所有函数都接受 int 作为参数,其值必须为 EOF 或可表示为无符号字符。
如果参数 c 满足所述条件,则所有函数返回非零值 (true),否则返回零 (false)。
库函数
以下是在头文件 ctype.h 中定义的函数 -
Sr.No. | 函数 &说明 |
---|---|
1 |
int isalnum(int c)
此函数检查传递的字符是否为字母数字。 |
2 |
int isalpha(int c)
此函数检查传递的字符是否为字母。 |
3 |
int iscntrl(int c)
此函数检查传递的字符是否为控制字符。 |
4 |
int isdigit(int c)
此函数检查传递的字符是否为十进制数字。 |
5 |
int isgraph(int c)
此函数检查传递的字符是否使用语言环境的图形表示。 |
6 |
int islower(int c)
此函数检查传递的字符是否为小写字母。 |
7 |
int isprint(int c)
此函数检查传递的字符是否可打印。 |
8 |
int ispunct(int c)
此函数检查传递的字符是否为标点符号。 |
9 |
int isspace(int c)
此函数检查传递的字符是否为空格。 |
10 |
int isupper(int c)
此函数检查传递的字符是否为大写字母。 |
11 |
int isxdigit(int c)
此函数检查传递的字符是否为十六进制数字。 |
12 |
int isblank(int c)
此函数检查传递的字符是否为空白字符。 |
该库还包含两个接受并返回"int"类型的转换函数。
Sr.No. | 函数 &说明 |
---|---|
1 |
int tolower(int c)
此函数将大写字母转换为小写字母。 |
2 |
int toupper(int c)
此函数将小写字母转换为大写字母。 |
字符类别
序号 | 字符类别 &描述 |
---|---|
1 |
数字 这是一组整数 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }。 |
2 |
十六进制数字 这是一组 { 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f }。 |
3 |
小写字母 这是一组小写字母 { a b c d e f g h i j k l m n o p q r s t u v w x y z }。 |
4 |
大写字母 这是一组大写字母 {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }。 |
5 |
字母 这是一组小写字母和大写字母。 |
6 |
字母数字字符 这是一组数字、小写字母和大写字母。 |
7 |
标点符号 这是一组! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ |
8 |
图形字符 这是一组字母数字字符和标点符号。 |
9 |
空格字符 这是一组制表符、换行符、垂直制表符、换页符、回车符和空格符。 |
10 |
可打印字符 这是一组字母数字字符、标点符号和空格字符。 |
11 |
控制字符 在 ASCII 中,这些字符的八进制代码为 000 到 037,以及 177 (DEL)。 |
12 |
空白字符 这些是空格和制表符。 |
13 |
字母字符 这是一组小写字母和大写字母。 |
C 库 - <errno.h>
C 标准库的 errno.h 头文件定义了整数变量 errno,它在发生错误时由系统调用和某些库函数设置,以指示出了什么问题。该宏扩展为可修改的 int 类型左值,因此程序可以读取和修改它。
errno 在程序启动时设置为零。标准 C 库的某些函数会将其值修改为非零值,以指示某些类型的错误。您还可以根据需要修改其值或将其重置为零。
errno.h 头文件还定义了一个宏列表,用于指示不同的错误代码,这些宏将扩展为类型为 int 的整型常量表达式。
库宏
以下是在头文件 errno.h 中定义的宏 -
Sr.No. | 宏 &说明 |
---|---|
1 |
extern int errno
这是系统调用和一些库函数在发生错误时设置的宏,用于指示出了什么问题。 |
2 |
EDOM Domain Error
此宏表示域错误,如果输入参数超出了定义数学函数的域,并且 errno 设置为 EDOM,则会发生该错误。 |
3 |
ERANGE Range Error
此宏表示范围错误,如果输入参数超出数学函数定义的范围,且 errno 设置为 ERANGE,则会发生该错误。 |
C 库 - <float.h>
C 库 float.h 头文件包含一组与浮点值相关的各种平台相关常量。这些常量由 ANSI C 提出。浮点宏允许开发人员创建更易于移植的程序。在了解所有常量之前,最好先了解一下浮点数,它由以下四个元素组成:
Sr.No. | 组件 &组件描述 |
---|---|
1 |
S 符号 ( +/- ) |
2 |
b 指数表示的底数或基数,二进制为 2,十进制为 10,十六进制为 16,依此类推…… |
3 |
e 指数,介于最小值 emin 和最大值之间的整数emax. |
4 |
p 精度是指有效数字中以 b 为底的位数。 |
基于以上四个组成部分,浮点数的值如下:
floating-point = ( S ) p x be or floating-point = (+/-) precision x baseexponent
库宏
以下值是特定于实现的,并使用 #define 指令定义,但这些值不得低于此处给出的值。请注意,在所有情况下,FLT 指的是 float 类型,DBL 指的是 double 类型,LDBL 指的是 long double 类型。
序号 | 宏 &说明 |
---|---|
1 |
FLT_ROUNDS 定义浮点加法的舍入模式,它可以是以下任意值 -
|
2 |
FLT_RADIX 2 定义指数的基数表示。以 2 为基数,以 10 为基数,以 16 为基数,以 10 为基数,都是十六进制。 |
3 |
FLT_MANT_DIG DBL_MANT_DIG LDBL_MANT_DIG 这些宏定义了数字的位数(以 FLT_RADIX 为基数)。 |
4 |
FLT_DIG 6 DBL_DIG 10 LDBL_DIG 10 这些宏定义了舍入后可以不变的最大十进制位数(以 10 为基数)。 |
5 |
FLT_MIN_EXP DBL_MIN_EXP LDBL_MIN_EXP 这些宏定义了以 FLT_RADIX 为底数的指数的最小负整数值。 |
6 |
FLT_MIN_10_EXP -37 DBL_MIN_10_EXP -37 LDBL_MIN_10_EXP -37 这些宏定义了以 FLT_RADIX 为底数的指数的最小负整数值10. |
7 |
FLT_MAX_EXP DBL_MAX_EXP LDBL_MAX_EXP 这些宏定义了以 FLT_RADIX 为底数的指数的最大整数值。 |
8 |
FLT_MAX_10_EXP +37 DBL_MAX_10_EXP +37 LDBL_MAX_10_EXP +37 这些宏定义了以以 10 为基数。 |
9 |
FLT_MAX 1E+37 DBL_MAX 1E+37 LDBL_MAX 1E+37 这些宏定义最大有限浮点值。 |
10 |
FLT_EPSILON 1E-5 DBL_EPSILON 1E-9 LDBL_EPSILON 1E-9 这些宏定义可表示的最低有效数字。 |
11 |
FLT_MIN 1E-37 DBL_MIN 1E-37 LDBL_MIN 1E-37 这些宏定义了最小浮点值。 |
示例 1
以下是 C 库头文件 float.h,用于定义几个宏(浮点型)常量的值。
#include <stdio.h> #include <float.h> int main () { printf("The maximum value of float = %.10e", FLT_MAX); printf("The minimum value of float = %.10e", FLT_MIN); printf("The number of digits in the number = %.10d", FLT_MANT_DIG); }
输出
执行上述代码后,我们得到以下结果 -
The maximum value of float = 3.4028234664e+38 The minimum value of float = 1.1754943508e-38 The number of digits in the number = 7.2996655210e-312
C 库 - <limits.h>
C 库 limits.h 头文件定义了不同变量类型的各种属性。此头文件中定义的宏限制了各种变量类型(例如 char、int 和 long)的值。
这些限制规定变量不能存储超出这些限制的任何值,例如,无符号字符最多可以存储 255 个值。
<limits.h> 库宏
以下值是特定于实现的,并使用 #define 指令定义。但是,这些值不能低于给定值。
宏 | 值 | 描述 |
---|---|---|
CHAR_BIT | 8 | 定义一个字节的位数。 |
SCHAR_MIN | -128 | 定义有符号字符的最小值。 |
SCHAR_MAX | +127 | 定义有符号字符的最大值。 |
UCHAR_MAX | 255 | 定义无符号字符的最大值。 |
CHAR_MIN | -128 | 定义字符类型的最小值,如果字符表示负值,则其值等于 SCHAR_MIN,否则为零。 |
CHAR_MAX | +127 | 定义对于 char 类型,如果 char 表示负值,则其值等于 SCHAR_MAX,否则等于 UCHAR_MAX。 |
MB_LEN_MAX | 16 | 定义多字节字符的最大字节数。 |
SHRT_MIN | -32768 | 定义短整型的最小值。 |
SHRT_MAX | +32767 | 定义短整型的最大值。 |
USHRT_MAX | 65535 | 定义无符号短整型的最大值。 |
INT_MIN | -2147483648 | 定义整数的最小值。 |
INT_MAX | +2147483647 | 定义整数的最大值。 |
UINT_MAX | 4294967295 | 定义无符号整数的最大值。 |
LONG_MIN | -9223372036854775808 | 定义长整数的最小值。 |
LONG_MAX | +9223372036854775807 | 定义长整数的最大值。 |
ULONG_MAX | 18446744073709551615 | 定义无符号长整型的最大值。 |
请注意,上述宏有助于开发者编写高效的代码,使其在不同平台和编译器下保持一致。
示例 1
以下是基本的 C 库程序,用于显示 limits.h 头文件下各种宏的值范围。
#include <stdio.h> #include <limits.h> int main() { printf("The value of CHAR_BIT: %d ", CHAR_BIT); printf("The value of SCHAR_MIN: %d ", SCHAR_MIN); printf("The value of SCHAR_MAX: %d ", SCHAR_MAX); printf("The value of UCHAR_MAX: %u ", UCHAR_MAX); printf("The value of CHAR_MIN: %d ", CHAR_MIN); printf("The value of CHAR_MAX: %d ", CHAR_MAX); printf("The value of MB_LEN_MAX: %d ", MB_LEN_MAX); printf("The value of SHRT_MIN: %d ", SHRT_MIN); printf("The value of SHRT_MAX: %d ", SHRT_MAX); printf("The value of USHRT_MAX: %u ", USHRT_MAX); printf("The value of INT_MIN: %d ", INT_MIN); printf("The value of INT_MAX: %d ", INT_MAX); printf("The value of UINT_MAX: %u ", UINT_MAX); printf("The value of LONG_MIN: %ld ", LONG_MIN); printf("The value of LONG_MAX: %ld ", LONG_MAX); printf("The value of ULONG_MAX: %lu ", ULONG_MAX); return 0; }
输出
执行上述代码后,我们得到以下结果 -
The value of CHAR_BIT: 8 The value of SCHAR_MIN: -128 The value of SCHAR_MAX: 127 The value of UCHAR_MAX: 255 The value of CHAR_MIN: -128 The value of CHAR_MAX: 127 The value of MB_LEN_MAX: 16 The value of SHRT_MIN: -32768 The value of SHRT_MAX: 32767 The value of USHRT_MAX: 65535 The value of INT_MIN: -2147483648 The value of INT_MAX: 2147483647 The value of UINT_MAX: 4294967295 The value of LONG_MIN: -9223372036854775808 The value of LONG_MAX: 9223372036854775807 The value of ULONG_MAX: 18446744073709551615
C 库 - <locale.h>
locale.h 头文件定义了特定于位置的设置,例如日期格式和货币符号。您将找到几个定义的宏以及一个重要的结构体 struct lconv 和下面列出的两个重要函数。
库宏
以下是头文件中定义的宏,这些宏将在下面列出的两个函数中使用 -
Sr.No. | 宏 &说明 |
---|---|
1 |
LC_ALL 设置所有内容。 |
2 |
LC_COLLATE 影响 strcoll 和 strxfrm 函数。 |
3 |
LC_CTYPE 影响所有字符函数。 |
4 |
LC_MONETARY 影响提供的货币信息通过 localeconv 函数。 |
5 |
LC_NUMERIC 影响小数点格式和 localeconv 函数提供的信息。 |
6 |
LC_TIME 影响 strftime 函数。 |
库函数
以下是在头文件 locale.h 中定义的函数 -
序列号 | 函数及说明 |
---|---|
1 |
char *setlocale(int category, const char *locale)
设置或读取位置相关信息。 |
2 |
struct lconv *localeconv(void)
设置或读取位置相关信息。 |
C 库 - <math.h>
math.h 头文件定义了各种数学函数和一个宏。此库中所有可用的函数都以 double 为参数,并返回 double 作为结果。
库宏
此库中仅定义了一个宏 -
序列号 | 宏 &说明 |
---|---|
1 |
HUGE_VAL 当函数结果无法用浮点数表示时,使用此宏。如果正确结果的幅值过大而无法表示,函数会将 errno 设置为 ERANGE 以指示范围错误,并返回一个由宏 HUGE_VAL 或其负数 (-HUGE_VAL) 指定的特定超大值。 如果结果幅值过小,则返回零值。在这种情况下,errno 可能会或可能不会设置为 ERANGE。 |
库函数
以下是在头文件 math.h 中定义的函数 -
C 库 - <setjmp.h>
setjmp.h 头文件定义了宏 setjmp()、函数 longjmp() 和一个变量类型 jmp_buf,用于绕过正常的函数调用和返回规则。
库变量
以下是头文件 setjmp.h 中定义的变量类型 -
Sr.No. | 变量 &描述 |
---|---|
1 |
jmp_buf 这是一个数组类型,用于保存宏 setjmp() 和函数 longjmp() 的信息。 |
库宏
此库中仅定义了一个宏 -
序号 | 宏 &说明 |
---|---|
1 |
int setjmp(jmp_buf environment)
此宏将当前环境保存到变量environment中,以供函数longjmp()稍后使用。如果此宏直接从宏调用返回,则返回零,但如果它从 longjmp() 函数调用返回,则返回非零值。 |
库函数
以下是头文件 setjmp.h 中定义的唯一函数 -
Sr.No. | 函数 &说明 |
---|---|
1 |
void longjmp(jmp_buf environment, int value)
此函数将恢复上次调用 setjmp() 宏时保存的环境,该调用与程序的同一调用中调用的 jmp_buf 宏时使用相应的 jmp_buf 参数进行操作。 |
C 库 - <signal.h>
signal.h 头文件定义了一个变量类型 sig_atomic_t、两个函数调用以及几个宏,用于处理程序执行期间报告的不同信号。
库变量
以下是头文件 signal.h 中定义的变量类型 -
Sr.No. | 变量 &描述 |
---|---|
1 |
sig_atomic_t 这是一个int类型,在信号处理程序中用作变量。这是一个整型对象,即使在存在异步信号的情况下,也可以作为原子实体访问。 |
库宏
以下是在头文件 signal.h 中定义的宏,这些宏将在以下列出的两个函数中使用。 SIG_ 宏与信号函数一起使用来定义信号函数。
Sr.No. | 宏 &描述 |
---|---|
1 |
SIG_DFL 默认信号处理程序。 |
2 |
SIG_ERR 表示信号错误。 |
3 |
SIG_IGN 信号忽略。 |
SIG 宏用于在以下情况下表示信号编号 -
序号 | 宏与描述 |
---|---|
1 |
SIGABRT 程序异常终止。 |
2 |
SIGFPE 浮点错误,例如除以零。 |
3 |
SIGILL 非法操作。 |
4 |
SIGINT 中断信号,例如ctrl-C。 |
5 |
SIGSEGV 无效的存储访问,例如段违规。 |
6 |
SIGTERM 终止请求。 |
库函数
以下是在头文件 signal.h 中定义的函数 -
Sr.No. | 函数& 说明 |
---|---|
1 |
void (*signal(int sig, void (*func)(int)))(int)
此函数设置一个用于处理信号的函数,即信号处理程序。 |
2 |
int raise(int sig)
此函数生成信号 sig。sig 参数与 SIG 宏兼容。 |
C 库 - <stdarg.h>
头文件 stdarg.h 定义了一个变量类型 va_list 和三个宏,当函数的参数数量未知(即参数数量可变)时,可以使用它们来获取函数中的参数。
可变参数的函数在参数列表末尾使用省略号 (,...) 来定义。
库变量
以下是头文件 stdarg.h 中定义的变量类型 -
Sr.No. | 变量 &说明 |
---|---|
1 |
va_list 此类型适用于保存三个宏 va_start()、va_arg() 和 va_end() 所需的信息。 |
库宏
以下是在头文件 stdarg.h 中定义的宏 -
Sr.No. | 宏 &说明 |
---|---|
1 |
void va_start(va_list ap, parmN)
此宏允许访问可变参数函数参数。 |
2 |
type va_arg(va_list ap, type)
此宏检索函数参数列表中类型为 type 的下一个参数。 |
3 |
void va_end(va_list ap)
此宏允许结束对可变函数参数的遍历。 |
4 |
void va_copy( va_list dest, va_list src )
此宏复制可变函数参数。 |
C 库 - <stddef.h>
stddef.h 头文件定义了各种变量类型和宏。其中许多定义也出现在其他头文件中。
库变量
以下是头文件 stddef.h 中定义的变量类型 -
Sr.No. | 变量 &说明 |
---|---|
1 |
ptrdiff_t 这是一个有符号整数类型,是两个指针相减的结果。 |
2 |
size_t 这是一个无符号整数类型,是 sizeof 关键字的结果。 |
3 |
wchar_t 这是一个宽字符常量大小的整数类型。 |
库宏
以下是在头文件 stddef.h 中定义的宏 -
Sr.No. | 宏 &说明 |
---|---|
1 |
NULL
此宏返回一个空指针常量的值。 |
2 |
offsetof(type,member-designator)
这将返回一个 size_t 类型的常量整数,该常量表示结构体成员相对于结构体开头的偏移量(以字节为单位)。成员由 member-designator 指定,结构体名称由 type 指定。 |
C 库 - <stdio.h>
stdio.h 头文件定义了三种变量类型、几个宏以及用于执行输入和输出的各种函数。
库变量
以下是头文件 stdio.h 中定义的变量类型 -
Sr.No. | 变量 &说明 |
---|---|
1 |
size_t 这是一个无符号整数类型,是 sizeof 关键字的结果。 |
2 |
FILE 这是一个适用于存储文件流信息的对象类型。 |
3 |
fpos_t 这是一个适用于存储文件中任意位置的对象类型。 |
库宏
以下是头文件 stdio.h 中定义的宏 -
Sr.No. | 宏 &说明 |
---|---|
1 |
NULL 此宏是空指针常量的值。 |
2 |
_IOFBF、_IOLBF 和 _IONBF 这些宏扩展为具有不同值的整型常量表达式,适合用作 setvbuf 函数的第三个参数。 |
3 |
BUFSIZ 此宏是一个整数,表示setbuf 函数。 |
4 |
EOF 此宏是一个负整数,表示已到达文件末尾。 |
5 |
FOPEN_MAX 此宏是一个整数,表示系统可以保证同时打开的最大文件数。 |
6 |
FILENAME_MAX 此宏是一个整数,表示适合保存最长文件名的字符数组的最长长度。如果实现没有限制,则此值应为建议的最大值。 |
7 |
L_tmpnam 此宏是一个整数,表示适合保存由 tmpnam 函数创建的最长临时文件名的字符数组的最长长度。 |
8 |
SEEK_CUR, SEEK_END, 和 SEEK_SET 这些宏在 fseek 函数中用于定位文件中的不同位置。 |
9 |
TMP_MAX 此宏表示函数 tmpnam 可以生成的唯一文件名的最大数量。 |
10 |
stderr、stdin 和 stdout 这些宏是指向 FILE 类型的指针,分别对应标准错误、标准输入和标准输出流。 |
库函数
以下是头文件 stdio.h 中定义的函数 -
C 库 - <stdlib.h>
stdlib.h 头文件定义了四种变量类型、几个宏以及用于执行常规功能的各种函数。
库变量
以下是头文件 stdlib.h 中定义的变量类型 -
Sr.No. | 变量 &说明 |
---|---|
1 |
size_t 这是一个无符号整数类型,是 sizeof 关键字的结果。 |
2 |
wchar_t 这是一个整数类型,其大小与 宽 字符常量相同。 |
3 |
div_t 这是 div 函数返回的结构体。 |
4 |
ldiv_t 这是 ldiv 函数返回的结构体。 |
库宏
以下是在头文件 stdlib.h 中定义的宏 -
Sr.No. | 宏 &说明 |
---|---|
1 |
NULL 此宏是空指针常量的值。 |
2 |
EXIT_FAILURE 这是退出函数在失败时返回的值。 |
3 |
EXIT_SUCCESS 这是退出函数在成功时返回的值。 |
4 |
RAND_MAX 此宏是 rand 函数返回的最大值。 |
5 |
MB_CUR_MAX 此宏是多字节字符集中的最大字节数,不能大于 MB_LEN_MAX。 |
库函数
以下是在头文件 stlib.h 中定义的函数 -
C 库 - <string.h>
string.h 头文件定义了一个变量类型、一个宏以及用于操作字符数组的各种函数。
库变量
以下是头文件 string.h 中定义的变量类型 -
Sr.No. | 变量 &说明 |
---|---|
1 |
size_t 这是一个无符号整数类型,是 sizeof 关键字的结果。 |
C 库 string.h 宏
以下是在头文件 string.h 中定义的宏 -
Sr.No. | 宏 &说明 |
---|---|
1 |
NULL 此宏是空指针常量的值。 |
C 库 string.h 函数
以下是在头文件 string.h 中定义的函数 -
C 库 - <time.h>
time.h 头文件定义了四种变量类型、两个宏以及用于操作日期和时间的各种函数。
库变量
以下是 time.h 头文件中定义的变量类型 -
Sr.No. | 变量 &说明 |
---|---|
1 |
size_t 这是一个无符号整数类型,是 sizeof 关键字的结果。 |
2 |
clock_t 这是一个适合存储处理器时间的类型。 |
3 |
time_t 这是一个适合存储日历时间的类型。 |
4 |
struct tm 这是一个用于保存时间和日期的结构体。 |
C 库宏
以下是在头文件 time.h 中定义的宏 -
Sr.No. | 宏 &说明 |
---|---|
1 |
NULL 此宏是空指针常量的值。 |
2 |
CLOCKS_PER_SEC 此宏表示每秒处理器时钟数。 |
C 库 time.h 函数
以下是在头文件 time.h 中定义的函数 -
Sr.No. | 函数 &说明 |
---|---|
1 |
char *asctime(const struct tm *timeptr)
返回一个指向字符串的指针,该字符串表示结构体 timeptr 的日期和时间。 |
2 |
clock_t clock(void)
返回自实现定义时代(通常是程序开始)以来使用的处理器时钟时间。 |
3 |
char *ctime(const time_t *timer)
根据参数 timer 返回表示本地时间的字符串。 |
4 |
double difftime(time_t time1, time_t time2)
返回 time1 和 time2 之间的秒差 (time1-time2)。 |
5 |
struct tm *gmtime(const time_t *timer)
值定时器的值被分解为结构体 tm,并以协调世界时 (UTC)(也称为格林威治标准时间 (GMT))表示。 |
6 |
struct tm *localtime(const time_t *timer)
定时器的值被分解为结构体 tm,并以本地时区表示。 |
7 |
time_t mktime(struct tm *timeptr)
根据本地时间将 timeptr 指向的结构体转换为 time_t 值时区。 |
8 |
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
根据 format 中定义的格式化规则,格式化结构体 timeptr 中的时间,并将其存储在 str 中。 |
9 |
time_t time(time_t *timer)
计算当前日历时间并将其编码为 time_t 格式。 |
10 |
size_t wcsftime( wchar_t* str, size_t count, const wchar_t* format, const struct tm* time )
将 tm 对象转换为自定义宽字符串文本表示形式。 |