C 标准库 - 参考手册
C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。
C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。
C 标准库是一组 C 内置函数、常量和头文件,比如 <stdio.h>、<stdlib.h>、<math.h>,等等。这个标准库可以作为 C 程序员的参考手册。
C 标准库 - <math.h>
简介
math.h 头文件定义了各种数学函数和一个宏。在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double 类型的结果。
库宏
下面是这个库中定义的唯一的一个宏:
序号 | 宏 & 描述 |
1 | HUGE_VAL 当函数的结果不可以表示为浮点数时。如果是因为结果的幅度太大以致于无法表示,则函数会设置 errno 为 ERANGE 来表示范围错误,并返回一个由宏 HUGE_VAL 或者它的否定(- HUGE_VAL)命名的一个特定的很大的值。 如果结果的幅度太小,则会返回零值。在这种情况下,error 可能会被设置为 ERANGE,也有可能不会被设置为 ERANGE。 |
库函数
下面列出了头文件 math.h 中定义的函数:
C 标准库 - <stdlib.h>
简介
stdlib .h 头文件定义了四个变量类型、一些宏和各种通用工具函数。
库变量
下面是头文件 stdlib.h 中定义的变量类型:
序号 | 变量 & 描述 |
1 | size_t |
2 | wchar_t |
3 | div_t |
4 | ldiv_t |
库宏
下面是头文件 stdlib.h 中定义的宏:
序号 | 宏 & 描述 |
1 | NULL |
2 | EXIT_FAILURE |
3 | EXIT_SUCCESS |
4 | RAND_MAX |
5 | MB_CUR_MAX |
库函数
下面是头文件 stdlib.h 中定义的函数:
C 标准库 - <assert.h>
简介
C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。
已定义的宏 assert 指向另一个宏 NDEBUG,宏 NDEBUG 不是 <assert.h> 的一部分。如果已在引用 <assert.h> 的源文件中定义 NDEBUG 为宏名称,则 assert 宏的定义如下:
#define assert(ignore) ((void)0)
库宏
下面列出了头文件 assert.h 中定义的唯一的函数:
序号 | 函数 & 描述 |
1 | void assert(int expression) |
C 标准库 -<ctype.h>
简介
C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和映射字符。
这些函数接受 int 作为参数,它的值必须是 EOF 或表示为一个无符号字符。
如果参数 c 满足描述的条件,则这些函数返回非零(true)。如果参数 c 不满足描述的条件,则这些函数返回零。
库函数
下面列出了头文件 ctype.h 中定义的函数:
序号 | 函数 & 描述 |
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) |
标准库还包含了两个转换函数,它们接受并返回一个 "int"
序号 | 函数 & 描述 |
1 | int tolower(int c) |
2 | int toupper(int c) |
字符类
序号 | 字符类 & 描述 |
1 | 数字 |
2 | 十六进制数字 |
3 | 小写字母 |
4 | 大写字母 |
5 | 字母 |
6 | 字母数字字符 |
7 | 标点符号字符 |
8 | 图形字符 |
9 | 空格字符 |
10 | 可打印字符 |
11 | 控制字符 |
12 | 空白字符 |
13 | 字母字符 |
C 标准库 - <errno.h>
简介
C 标准库的 errno.h 头文件定义了整数变量 errno,它是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误。该宏扩展为类型为 int 的可更改的左值,因此它可以被一个程序读取和修改。
在程序启动时,errno 设置为零,C 标准库中的特定函数修改它的值为一些非零值以表示某些类型的错误。您也可以在适当的时候修改它的值或重置为零。
errno.h 头文件定义了一系列表示不同错误代码的宏,这些宏应扩展为类型为 int 的整数常量表达式。
库宏
下面列出了头文件 errno.h 中定义的宏:
序号 | 宏 & 描述 |
1 | extern int errno |
2 | EDOM Domain Error |
3 | ERANGE Range Error |
C 标准库 - <float.h>
简介
C 标准库的 float.h 头文件包含了一组与浮点值相关的依赖于平台的常量。这些常量是由 ANSI C 提出的,这让程序更具有可移植性。在讲解这些常量之前,最好先弄清楚浮点数是由下面四个元素组成的:
组件 | 组件描述 |
S | 符号 ( +/- ) |
b | 指数表示的基数,2 表示二进制,10 表示十进制,16 表示十六进制,等等... |
e | 指数,一个介于最小值 emin 和最大值 emax 之间的整数。 |
p | 精度,基数 b 的有效位数 |
基于以上 4 个组成部分,一个浮点数的值如下:
floating-point = ( S ) p x be
或
floating-point = (+/-) precision x baseexponent
库宏
下面的值是特定实现的,且是通过 #define 指令来定义的,这些值都不得低于下边所给出的值。请注意,所有的实例 FLT 是指类型 float,DBL 是指类型 double,LDBL 是指类型 long double。
宏 | 描述 |
FLT_ROUNDS | 定义浮点加法的舍入模式,它可以是下列任何一个值: -1 - 无法确定 0 - 趋向于零 1 - 去最近的值 2 - 趋向于正无穷 3 - 趋向于负无穷 |
FLT_RADIX 2 | 这个宏定义了指数表示的基数。基数 2 表示二进制,基数 10 表示十进制,基数 16 表示十六进制。 |
FLT_MANT_DIG DBL_MANT_DIG LDBL_MANT_DIG | 这些宏定义了 FLT_RADIX 基数中的位数。 |
FLT_DIG 6 DBL_DIG 10 LDBL_DIG 10 | 这些宏定义了舍入后不会改变表示的十进制数字的最大值(基数 10)。 |
FLT_MIN_EXP DBL_MIN_EXP LDBL_MIN_EXP | 这些宏定义了基数为 FLT_RADIX 时的指数的最小负整数值。 |
FLT_MIN_10_EXP -37 DBL_MIN_10_EXP -37 LDBL_MIN_10_EXP -37 | 这些宏定义了基数为 10 时的指数的最小负整数值。 |
FLT_MAX_EXP DBL_MAX_EXP LDBL_MAX_EXP | 这些宏定义了基数为 FLT_RADIX 时的指数的最大整数值。 |
FLT_MAX_10_EXP +37 DBL_MAX_10_EXP +37 LDBL_MAX_10_EXP +37 | 这些宏定义了基数为 10 时的指数的最大整数值。 |
FLT_MAX 1E+37 DBL_MAX 1E+37 LDBL_MAX 1E+37 | 这些宏定义最大的有限浮点值。 |
FLT_EPSILON 1E-5 DBL_EPSILON 1E-9 LDBL_EPSILON 1E-9 | 这些宏定义了可表示的最小有效数字。 |
FLT_MIN 1E-37 DBL_MIN 1E-37 LDBL_MIN 1E-37 | 这些宏定义了最小的浮点值。 |
实例
下面的实例演示了 float.h 文件中定义的一些常量的使用。
#include <stdio.h>
#include <float.h>
int main()
{
printf("The maximum value of float = %.10e\n", FLT_MAX);
printf("The minimum value of float = %.10e\n", FLT_MIN);
printf("The number of digits in the number = %.10e\n", 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>
简介
limits.h 头文件决定了各种变量类型的各种属性。定义在该头文件中的宏限制了各种变量类型(比如 char、int 和 long)的值。
这些限制指定了变量不能存储任何超出这些限制的值,例如一个无符号可以存储的最大值是 255。
库宏
下面的值是特定实现的,且是通过 #define 指令来定义的,这些值都不得低于下边所给出的值。
宏 | 值 | 描述 |
CHAR_BIT | 8 | 定义一个字节的比特数。 |
SCHAR_MIN | -128 | 定义一个有符号字符的最小值。 |
SCHAR_MAX | 127 | 定义一个有符号字符的最大值。 |
UCHAR_MAX | 255 | 定义一个无符号字符的最大值。 |
CHAR_MIN | 0 | 定义类型 char 的最小值,如果 char 表示负值,则它的值等于 SCHAR_MIN,否则等于 0。 |
CHAR_MAX | 127 | 定义类型 char 的最大值,如果 char 表示负值,则它的值等于 SCHAR_MAX,否则等于 UCHAR_MAX。 |
MB_LEN_MAX | 1 | 定义多字节字符中的最大字节数。 |
SHRT_MIN | -32768 | 定义一个短整型的最小值。 |
SHRT_MAX | +32767 | 定义一个短整型的最大值。 |
USHRT_MAX | 65535 | 定义一个无符号短整型的最大值。 |
INT_MIN | -32768 | 定义一个整型的最小值。 |
INT_MAX | +32767 | 定义一个整型的最大值。 |
UINT_MAX | 65535 | 定义一个无符号整型的最大值。 |
LONG_MIN | -2147483648 | 定义一个长整型的最小值。 |
LONG_MAX | +2147483647 | 定义一个长整型的最大值。 |
ULONG_MAX | 4294967295 | 定义一个无符号长整型的最大值。 |
实例
下面的实例演示了 limit.h 文件中定义的一些常量的使用。
#include <stdio.h>#include <limits.h>
int main(){
printf("The number of bits in a byte %d\n", CHAR_BIT);
printf("The minimum value of SIGNED CHAR = %d\n", SCHAR_MIN);
printf("The maximum value of SIGNED CHAR = %d\n", SCHAR_MAX);
printf("The maximum value of UNSIGNED CHAR = %d\n", UCHAR_MAX);
printf("The minimum value of SHORT INT = %d\n", SHRT_MIN);
printf("The maximum value of SHORT INT = %d\n", SHRT_MAX);
printf("The minimum value of INT = %d\n", INT_MIN);
printf("The maximum value of INT = %d\n", INT_MAX);
printf("The minimum value of CHAR = %d\n", CHAR_MIN);
printf("The maximum value of CHAR = %d\n", CHAR_MAX);
printf("The minimum value of LONG = %ld\n", LONG_MIN);
printf("The maximum value of LONG = %ld\n", LONG_MAX);
return(0);}
让我们编译和运行上面的程序,这将产生下列结果:
The number of bits in a byte 8The minimum value of SIGNED CHAR = -128The maximum value of SIGNED CHAR = 127The maximum value of UNSIGNED CHAR = 255The minimum value of SHORT INT = -32768The maximum value of SHORT INT = 32767The minimum value of INT = -32768The maximum value of INT = 32767The minimum value of CHAR = -128The maximum value of CHAR = 127The minimum value of LONG = -2147483648The maximum value of LONG = 2147483647
C 标准库 - <locale.h>
简介
locale.h 头文件定义了特定地域的设置,比如日期格式和货币符号。接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两个重要的函数。
库宏
下面列出了头文件 locale.h 中定义的宏,这些宏将在下列的两个函数中使用:
序号 | 宏 & 描述 |
1 | LC_ALL |
2 | LC_COLLATE |
3 | LC_CTYPE |
4 | LC_MONETARY |
5 | LC_NUMERIC |
6 | LC_TIME |
库函数
下面列出了头文件 locale.h 中定义的函数:
序号 | 函数 & 描述 |
1 | char *setlocale(int category, const char *locale) |
2 | struct lconv *localeconv(void) |
库结构
typedef struct {
char *decimal_point;
char *thousands_sep;
char *grouping;
char *int_curr_symbol;
char *currency_symbol;
char *mon_decimal_point;
char *mon_thousands_sep;
char *mon_grouping;
char *positive_sign;
char *negative_sign;
char int_frac_digits;
char frac_digits;
char p_cs_precedes;
char p_sep_by_space;
char n_cs_precedes;
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
} lconv
以下是各字段的描述:
序号 | 字段 & 描述 |
1 | decimal_point |
2 | thousands_sep |
3 | grouping |
4 | int_curr_symbol |
5 | currency_symbol |
6 | mon_decimal_point |
7 | mon_thousands_sep |
8 | mon_grouping |
9 | positive_sign |
10 | negative_sign |
11 | int_frac_digits |
12 | frac_digits |
13 | p_cs_precedes |
14 | p_sep_by_space |
15 | n_cs_precedes |
16 | n_sep_by_space |
17 | p_sign_posn |
18 | n_sign_posn |
下面的值用于 p_sign_posn 和 n_sign_posn:
值 | 描述 |
0 | 封装值和 currency_symbol 的括号。 |
1 | 放置在值和 currency_symbol 之前的符号。 |
2 | 放置在值和 currency_symbol 之后的符号。 |
3 | 紧挨着放置在值和 currency_symbol 之前的符号。 |
4 | 紧挨着放置在值和 currency_symbol 之后的符号。 |
C 标准库 - <setjmp.h>
简介
setjmp.h 头文件定义了宏 setjmp()、函数 longjmp() 和变量类型 jmp_buf,该变量类型会绕过正常的函数调用和返回规则。
库变量
下面列出了头文件 setjmp.h 中定义的变量:
序号 | 变量 & 描述 |
1 | jmp_buf |
库宏
下面是这个库中定义的唯一的一个宏:
序号 | 宏 & 描述 |
1 | int setjmp(jmp_buf environment) |
库函数
下面是头文件 setjmp.h 中定义的唯一的一个函数:
序号 | 函数 & 描述 |
1 | void longjmp(jmp_buf environment, int value) |
C 标准库 - <signal.h>
简介
signal.h 头文件定义了一个变量类型 sig_atomic_t、两个函数调用和一些宏来处理程序执行期间报告的不同信号。
库变量
下面是头文件 signal.h 中定义的变量类型:
序号 | 变量 & 描述 |
1 | sig_atomic_t |
库宏
下面是头文件 signal.h 中定义的宏,这些宏将在下列两个函数中使用。SIG_ 宏与 signal 函数一起使用来定义信号的功能。
序号 | 宏 & 描述 |
1 | SIG_DFL |
2 | SIG_ERR |
3 | SIG_IGN |
SIG 宏用于表示以下各种条件的信号码:
序号 | 宏 & 描述 |
1 | SIGABRT |
2 | SIGFPE |
3 | SIGILL |
4 | SIGINT |
5 | SIGSEGV |
6 | SIGTERM |
库函数
下面是头文件 signal.h 中定义的函数:
序号 | 函数 & 描述 |
1 | void (*signal(int sig, void (*func)(int)))(int) |
2 | int raise(int sig) |
C 标准库 - <stdarg.h>
简介
stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数。
可变参数的函数通在参数列表的末尾是使用省略号(,...)定义的。
库变量
下面是头文件 stdarg.h 中定义的变量类型:
序号 | 变量 & 描述 |
1 | va_list |
库宏
下面是头文件 stdarg.h 中定义的宏:
序号 | 宏 & 描述 |
1 | void va_start(va_list ap, last_arg) |
2 | type va_arg(va_list ap, type) |
3 | void va_end(va_list ap) |
C 标准库 - <stddef.h>
简介
stddef .h 头文件定义了各种变量类型和宏。这些定义中的大部分也出现在其它头文件中。
库变量
下面是头文件 stddef.h 中定义的变量类型:
序号 | 变量 & 描述 |
1 | ptrdiff_t |
2 | size_t |
3 | wchar_t |
库宏
下面是头文件 stddef.h 中定义的宏:
序号 | 宏 & 描述 |
1 | NULL |
2 | offsetof(type, member-designator) |
C 标准库 - <stdio.h>
简介
stdio .h 头文件定义了三个变量类型、一些宏和各种函数来执行输入和输出。
库变量
下面是头文件 stdio.h 中定义的变量类型:
序号 | 变量 & 描述 |
1 | size_t |
2 | FILE |
3 | fpos_t |
库宏
下面是头文件 stdio.h 中定义的宏:
序号 | 宏 & 描述 |
1 | NULL |
2 | _IOFBF、_IOLBF 和 _IONBF |
3 | BUFSIZ |
4 | EOF |
5 | FOPEN_MAX |
6 | FILENAME_MAX |
7 | L_tmpnam |
8 | SEEK_CUR、SEEK_END 和 SEEK_SET |
9 | TMP_MAX |
10 | stderr、stdin 和 stdout |
库函数
下面是头文件 stdio.h 中定义的函数:
为了更好地理解函数,请按照下面的序列学习这些函数,因为第一个函数中创建的文件会在后续的函数中使用到。
C 标准库 - <string.h>
简介
string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
库变量
下面是头文件 string.h 中定义的变量类型:
序号 | 变量 & 描述 |
1 | size_t |
库宏
下面是头文件 string.h 中定义的宏:
序号 | 宏 & 描述 |
1 | NULL |
库函数
下面是头文件 string.h 中定义的函数:
C 标准库 - <time.h>
简介
time.h 头文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。
库变量
下面是头文件 time.h 中定义的变量类型:
序号 | 变量 & 描述 |
1 | size_t |
2 | clock_t |
3 | time_t is |
4 | struct tm |
tm 结构的定义如下:
struct tm {
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月,范围从 0 到 11 */
int tm_year; /* 自 1900 年起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */};
库宏
下面是头文件 time.h 中定义的宏:
序号 | 宏 & 描述 |
1 | NULL |
2 | CLOCKS_PER_SEC |
库函数
下面是头文件 time.h 中定义的函数:
序号 | 函数 & 描述 |
1 | char *asctime(const struct tm *timeptr) |
2 | clock_t clock(void) |
3 | char *ctime(const time_t *timer) |
4 | double difftime(time_t time1, time_t time2) |
5 | struct tm *gmtime(const time_t *timer) |
6 | struct tm *localtime(const time_t *timer) |
7 | time_t mktime(struct tm *timeptr) |
8 | size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) |
9 | time_t time(time_t *timer) |