系列文章目录
- C语言综述
- C语言字符集
- C语言词法元素
- C语言表达式
- C语言语句
- C语言声明
- C语言预处理指令
- C语言头文件
前言
为什么要读标准?因为全面、权威,所有答案都在标准里面! 哪些人适合浏览本系列文章?不清楚C语言程序的组成,以及每个组成部分的详细内容 持续更新,码字不易,求点赞收藏
# 1、头文件 ## 1.1、
用法 assert(表达式) static_assert(表达式) C11
说明 assert 运行时断言,影响性能 #error 相当于预编译期断言,配合#ifdef、#ifndef使用 static_assert 编译期断言,必须是编译期可计算的表达式 #define NDEBUG 消除所有断言
1.2、<ctype.h>
概述 测试和映射字符,实参都是int或者等于EOF
用法
1.3、<errno.h>
概述 保存最后的错误代码
用法 <stdio.h>perror()输出错误信息 <string.h>strerror()获取错误文本
说明 单线程程序一般展开为全局变量,多线程程序通过函数实现 任何一个错误都可能改变它的值,通常调用函数前将其置为0 C89、C99强制要求的三个宏:
- EDOM 域错误,数学函数超出定义域
- ERANGE 范围错误,数值溢出
- EILSEQ 非法序列,多字节字符和宽字符间转换时,遇到无效字符,比如wrtomb(buffer, L’\xfffff’,&mbs)
C11可移植的宏拓展到78个
1.4、<locale.h>
概述 本地化程序
用法 char* setlocale(int category, const char* locale); 设置地域 struct lconv *localeconv(void); 返回当前地域设置结构体
说明
结构体lconv成员 | C地域应当值 | 含义 |
---|
char *decimal_point; | /* “.” */ | 非货币值的小数点字符 | char *thousands_sep; | /* “” */ | 非货币值的千位分隔符 | char *grouping; | /* “” */ | 非货币量中每组数字大小的字符串,值为0意味着前一个值将用于剩余分组 | 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_MAX */ | 国际货币值中小数点后显示位数 | char frac_digits; | /* CHAR_MAX */ | 货币值中小数点后显示位数 | char p_cs_precedes; | /* CHAR_MAX */ | 值为1:货币本地符号在正货币值前,值为0:货币本地符号在正货币值后 | char p_sep_by_space; | /* CHAR_MAX */ | 值为1:货币本地符号和正货币值用空格分隔,值为0:货币本地符号和正货币值不用空格分隔 | char n_cs_precedes; | /* CHAR_MAX */ | 值为1:货币本地符号在负货币值前,值为0:货币本地符号在负货币值后 | char n_sep_by_space; | /* CHAR_MAX */ | 值为1:货币本地符号和负货币值用空格分隔,值为0:货币本地符号和负货币值不用空格分隔 | char p_sign_posn; | /* CHAR_MAX */ | 正货币值中正号位置 | char n_sign_posn; | /* CHAR_MAX */ | 负货币值中负号位置 |
1.5、<math.h>
概述 数学函数和HUGE_VAL宏,函数参数和范围值都是double
说明
| | | | | |
---|
三角函数 | 描述 | 取值范围 | 指数和对数函数 | 描述 | 取值范围 | double acos(double x); | 反余弦函数 | [-1, 1] | double exp(double x); | e的x次方 | 浮点范围 | double asin(double x); | 反正弦函数 | [-1, 1] | double frexp(double value, int *exp); | 浮点数分解 指数为*exp 尾数为返回值 | 浮点范围 | double atan(double x); | 反正切函数 | 浮点范围 | double ldexp(double x, int exp); | x乘以2的exp次幂 | 浮点范围 | double atan2(double y, double x) | (x, y)的方位角 x + yi的辐角 | (-pi, pi]; | double log(double x); | x的自然对数 | 浮点范围 | double cos(double x); | 余弦 | 浮点范围 | double log10(double x); | x的以10为底的对数 | 浮点范围 | double sin(double x); | 正弦 | 浮点范围 | double modf(double value, double *iptr); | 浮点数分解 整数部分为*iptr 小数部分为返回值 | 浮点范围 | double tan(double x); | 正切 | 不等于pi/2+kpi | | | |
| | | | | |
---|
双曲线函数(用于线性微分方程) | 描述; | 取值范围 | 幂函数 | 描述 | | double cosh(double x); | 双曲余弦 | 浮点范围 | double pow(double x, double y); | x的y次方 | 浮点范围 | double sinh(double x); | 双曲正弦 | 浮点范围 | double sqrt(double x); | x的平方根 | 浮点范围 | double tanh(double x); | 双曲正切 | 浮点范围 | | | |
| | |
---|
其他函数 | 描述 | 取值范围 | double ceil(double x); | 向上取整 | 浮点范围 | double fabs(double x); | 绝对值 | 浮点范围 | double floor(double x); | 向下取整 | 浮点范围 | double fmod(double x, double y); | x/y的余数 | 浮点范围 |
1.6、<serjmp.h>
概述 数组类型的jmp_buf变量,存放恢复调用环境所需的信息
用法
- 保存调用环境int setjmp(jmp_buf env),直接调用返回时返回0值,longjmp调用返回时返回非零值
- 恢复调用环境void longjmp(jmp_bufenv, int val),恢复程序同一次激活中最近一次setjmp保存的环境,若没有setjmp执行则未定义
1.7、<signal.h>
概述 用于处理各种各样的信号(在程序执行期间可报告的情况),sig_atomic_t类型
用法 信号处理函数void(*signal(int sig, void(*func)(int)))(int);
- sig为接收的信号
- func的值为SIG_DFL时,对信号默认处理
- func的值为SIG_IGN时,忽略该信号
- func的值为SIG_ERR时,指向一个信号出现应该调用的函数
int raise(int sig); 向正在执行的程序发送信号sig,成功返回非零值,否则返回0
说明
| |
---|
SIGABRT | 非正常终止,例如由函数abort引发 | SIGFPE | 一个错误的算术运算,例如除以0 | SIGILL | 检测出一个无效的函数映像,例如一条非法指令 | SIGINT | 收到一个交互的“注意信号” | SIGSEGV | 无效的存储区访问 | SIGTERM | 送给程序的终止请求 |
1.8、<stdarg.h>
概述 变长参数
用法 …作为函数第二个或之后的形参,函数第一个参数必须是固定参数,函数内声明一个va_list对象
- void va_start(va_list ap, parmN); 初始化ap存放参数信息,parmN即函数第一个参数,可见函数的传值是从右到左的
- type va_arg(va_list ap, type);获得下一个type类型的对象
- void va_end(va_list ap);使ap变为不可再用,与start成对使用
1.9、<stdio.h>
概述 输入输出
用法 FILE对象类型,能记录控制一个流的全部信息 fpos_t对象类型,能记录唯一的指定在文件中每一位置所需的信息
说明
| | | |
---|
文件操作; | 说明; | 文件访问; | 说明 | int remove(const char *filename); | 删除filename文件; | int fclose(FILE *stream); | 刷新流并解除关联 回收自动分配的缓冲区 | int rename(const char *old, const char *new); | 重命名old文件; | int fflush(FILE *stream); | 所有流尚未写出的数据写出 | FILE *tmpfile(void); | 创建临时的二进制文件 文件关闭或程序终止自动删除; | FILE *fopen(const char *filename, const char *mode); | 打开一个文件,建立与之相关的流 | char *tmpnam(char *s); | 生成一个不同于已存在文件名的有效文件名 实参为空指针,结果为返回值 实参不为空指针,结果保存于实参; | FILE *freopen(const char *filename, const char *mode, FILE *stream); | 使流与filename关联 改变标准输入输出错误流指向 | ; | ; | void setbuf(FILE *stream, char *buf); | 设置流为完全缓冲 | ; | ; | int setvbuf(FILE *stream, char *buf, int mode, size_t size); | 设置流的缓冲区 |
| |
---|
格式化输入输出; | 说明 | int fprintf(FILE *stream, const char *format, …); | 输出到文件 | int fscanf(FILE *stream, const char *format, …); | 从文件输入 | int printf(const char *format, …); | 输出到标准输出 | int scanf(const char *format, …); | 从标准输入输入 | int sprintf(char *s, const char *format, …); | 输出到字符串 | int sscanf(const char *s, const char *format, …); | 从字符串输入 | int vfprintf(FILE *stream, const char *format, va_list arg); | 等价于fprintf | int vprintf(const char *format, va_list arg); | 等价于printf | int vsprintf(char *s, const char *format, va_list arg); | 等价于sprintf |
| |
---|
字符输入输出; | 说明 | int fgetc(FILE *stream); | 从流读取下一个字符,推进文件位置指示符 | char *fgets(char *s, int n, FILE *stream); | 读取n-1个字符到s,在最后写入空字符 | int fputc(int c, FILE *stream); | 输出c到文件,恰当推进文件位置指示符 | int fputs(const char *s, FILE *stream); | 将s写入文件,空字符除外 | int getc(FILE *stream); | 等价于fgetc | int getchar(void); | 等价于标准输入的fgetc | char *gets(char *s); | 丢弃新行字符读取到s直至文件尾 | int putc(int c, FILE *stream); | 等价于fputc | int putchar(int c); | 等价于标准输出的fputc | int puts(const char *s); | 输出s到标准输出,并添加一个新行字符 | int ungetc(int c, FILE *stream); | 退回c至文件中 |
| |
---|
直接输入输出; | 说明 | size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); | 读取nmemb个尺寸为size的元素到ptr | size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); | 从ptr写入nmemb个尺寸为size的元素 |
| |
---|
文件定位; | 说明 | int fgetpos(FILE *stream, fpos_t *pos); | 获取文件流的位置指示符 | int fseek(FILE *stream, long int offset, int whence); | 设置stream的位置指示符 | int fsetpos(FILE *stream, const fpos_t *pos); | 设置stream的位置指示符为pos | long int ftell(FILE *stream); | 获得位置指示符的当前值 | void rewind(FILE *stream); | 将位置指示符置于文件开始 | 出错处理; | 说明 | void clearerr(FILE *stream); | 清除文件尾指示符和出错指示符 | int feof(FILE *stream); | 测试文件尾指示符 | int ferror(FILE *stream); | 测试出错指示符 | void perror(const char *s); | 输出出错信息 |
1.10、<stdlib.h>
概述 标准库,通用函数
说明
| |
---|
字符转换; | 描述 | double atof(const char *nptr); | 将nptr指向的串起始部分转换成double | int atoi(const char *nptr); | 将nptr指向的串起始部分转换成int | long int atol(const char *nptr); | 将nptr指向的串起始部分转换成long int | double strtod(const char *nptr, char **endptr); | 将nptr指向的串起始部分转换成double | long int strtol(const char *nptr, char **endptr, int base); | 将nptr指向的串起始部分转换成long int | unsigned long int strtoul(const char *nptr, char **endptr, int base); | 将nptr指向的串起始部分转换成unsigned long int |
| |
---|
随机数; | 描述 | int rand(void); | 计算0至RAND_MAX之间的伪随机整数序列 | void srand(unsigned int seed); | 用实参作为一个后继的rand函数的种 |
| |
---|
内存管理; | 描述 | void *calloc(size_t nmemb, size_t size); | nmenb个大小size的空间指针,初始化为0 | void free(void *ptr); | 释放ptr指向的空间 | void *malloc(size_t size); | size大小的空间,初始值不确定 | void *realloc(void *ptr, size_t size); | 将ptr指向的对象的尺寸改变为size所规定的尺寸 |
| |
---|
环境; | 描述 | void abort(void); | 程序非正常终止除非SIGABRT被截获且信号处理程序不返回 | int atexit(void (*func)(void)); | 登记func所指向的函数,一遍在程序正常终止时无实参地调用函数 | void exit(int status); | 程序正常终止 | char *getenv(const char *name); | 在宿主环境环境表中搜索name | int system(const char *string); | 将string传递给宿主环境 |
| |
---|
搜索和排序; | 描述 | void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); | 在nmemb个大小为size第一个元素为base按compar比较和key匹配的元素 | void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); | 将nmemb个大小为size第一个元素为base按compar比较的数组排序 |
| |
---|
整数算术; | 描述 | int abs(int j); | 绝对值 | div_t div(int numer, int denom); | numer除以denom的商和余数 | long int labs(long int j); | 绝对值 | ldiv_t ldiv(long int numer, long int denom); | numer除以denom的商和余数 |
| |
---|
多字符; | 描述 | int mblen(const char *s, size_t n); | 确定s的字节数 | int mbtowc(wchar_t *pwc, const char *s, size_t n); | 确定字节数、对应于该多字节字符的wchar_t类型值的代码 | int wctomb(char *s, wchar_t wchar); | 确定对应于值是wchar的代码的多字节字符所需的字节数 | size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n); | 将s指向的数组以初始转义状态开始的一系列多字节字符转换成一系列对应的代码 | size_t wcstombs(char *s, const wchar_t *pwcs, size_t n); | 将pwcs指向的数组中的一系列对应于多字节字符的代码转换成由初始转义状态开始的一系列多字节字符 |
1.11、<string.h>
概述 字符操作 说明
| |
---|
复制; | 说明 | void *memcpy(void *s1, const void *s2, size_t n); | 从s2复写n个字符到s1 | void *memmove(void *s1, const void *s2, size_t n); | 从s2复写n个字符到s1 | char *strcpy(char *s1, const char *s2); | 将s2复写到s1包括空字符 | char *strncpy(char *s1, const char *s2, size_t n); | 将s2不超过n个字符复写到s1 |
| |
---|
连接; | 说明 | char *strcat(char *s1, const char *s2); | s1后添加s2,s2第一个字符覆盖s1的空字符 | char *strncat(char *s1, const char *s2, size_t n); | s1后添加s2不超过n个字符,s2第一个字符覆盖s1的空字符 |
| |
---|
比较; | 说明 | int memcmp(const void *s1, const void *s2, size_t n); | 比较s1和s2的前n个字符 | int strcmp(const char *s1, const char *s2); | 比较s1和s2 | int strcoll(const char *s1, const char *s2); | 比较s1和s2 | int strncmp(const char *s1, const char *s2, size_t n); | 将s1不超过n个字符与s2比较 | size_t strxfrm(char *s1, const char *s2, size_t n); | 将s2变换后复写到s1不超过n个字符 |
| |
---|
搜索; | 说明 | void *memchr(const void *s, int c, size_t n); | s前n个字符第一次出现c的位置 | char *strchr(const char *s, int c); | s第一次出现c的位置 | size_t strcspn(const char *s1, const char *s2); | 计算s1最大的完全由不在s2中字符组成的初始段长度 | char *strpbrk(const char *s1, const char *s2); | s1出现s2任一字符的位置 | char *strrchr(const char *s, int c); | s最后出现c的位置 | size_t strspn(const char *s1, const char *s2); | 计算s1最大的完全由s2中字符组成的初始段长度 | char *strstr(const char *s1, const char *s2); | 确定s1指向的串中第一次出现s2指向的串中的字符序列 | char *strtok(char *s1, const char *s2); | 一系列的strtok将s1分解成一系列用s2中一个字符界定的单词 |
| |
---|
杂项; | 说明 | void *memset(void *s, int c, size_t n); | 将s前n个字符都写为c的值 | char *strerror(int errnum); | 将errnum中出错号映射为一条出错消息 | size_t strlen(const char *s); | 计算s指向的串的长度 |
1.12、<time.h>
概述 时间相关操作 用法
| |
---|
时间操作函数; | 说明 | clock_t clock(void); | 确定所使用的处理器时间 | double difftime(time_t time1, time_t time0); | 计算两个日历的时间差 | time_t mktime(struct tm *timeptr); | 按当地时间表达的分段时间转换为日历时间值 | time_t time(time_t *timer); | 确定当前的日历时间 | char *asctime(const struct tm *timeptr); | 将分段时间转换为确定形式的串 | char *ctime(const time_t *timer); | 将日历时间转换为确定形式的串 | struct tm *gmtime(const time_t *timer); | 将日历时间转换为国际标准的分段时间 | struct tm *localtime(const time_t *timer); | 将日历时间转换为当地分段时间 | size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr); | 将字符存入s |
到这里所有库介绍结束 库不是15个?原来有三个库是没有函数的
1.13、<float.h>
概述 包含一组与浮点值相关的依赖于平台的常量
说明
| |
---|
FLT_ROUNDS; | 定义浮点加法的舍入模式,它可以是下列任何一个值 | 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; | 这些宏定义了最小的浮点值。 |
1.14、<stddef.h>
概述 定义了各种变量类型和宏,这些定义大部分也出现在其他头文件中
说明
| | |
---|
ptrdiff_t | 有符号整数类型 | 两个指针相减 | size_t | 无符号整数类型 | sizeof关键字结果 | wchar_t | 宽字符常量大小的整数类型 | | NULL | 空指针常量 | ((void *)0)、0、0L | offsetof(type, member-designator) | 获得字段在结构体的偏移量 | |
1.15、<limits.h>
概述 定义限制各种变量类型的各种属性 说明
| | |
---|
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; | -2147483648; | 定义一个整型的最小值。 | INT_MAX; | 2147483647; | 定义一个整型的最大值。 | UINT_MAX; | 4294967296; | 定义一个无符号整型的最大值。 | LONG_MIN; | -9223372036854775808; | 定义一个长整型的最小值。 | LONG_MAX; | 9223372036854775807; | 定义一个长整型的最大值。 | ULONG_MAX; | 1.8446744e+19; | 定义一个无符号长整型的最大值。 |
? ? ? ? ? ? ? ?
以上纯属个人观点,欢迎大佬批评指正
|