拾遗:ANSI C
<ctype.h>:用于测试或转换字符
- int isalnum(int c); 检查字符c是否是字母或数字
- int isalpha(int c); 检查字符c是否是字母
- int iscntrl(int c); 是否是控制字符,asni编码中000至037及177(DEL)
- int isdigit(int c); 是否是十进制数字
- int isxdigit(int c); 是否是十六进制数字
- int isgraph(int c); 检查字符c是否有图形表示法,等价于alnum与punct的合集
- int islower(int c); 是否是小写字母
- int isupper(int c); 是否是大写字母
- int ispunct(int c); 是否是标点符号
- int isblank(int c); 是否是空格符或制表符
- int isspace(int c); 是否是空格、换行、回车、换页、水平及竖直制表符
- int tolower(int c); 把大写字母转换为小写
- int toupper(int c); 把小写字母转换为大写
<errno.h>:程序启动时,被初始化为0,非零值对应不同的错误,其值可人为修改;
<float.h>:ANSI标准中关于浮点数的常量,FLT指float类型,DBL指double类型,LDBL指long double类型;
浮点数结构:
floating-point = (+/-) precision x baseexponentbase——基数,2表示二进制,10表示十进制,16表示十六进制;precision——精度,基数base的有效位数;exponent——指数,介于emin与emax之间的整数
- FLT_MAX FLT_MIN float类型最大最小值
- DBL_MAX DBL_MIN double因型最大最小值
- LDBL_MAX LDBL_MIN long double类型最大最小值
<limits.h>:定义了char、short、int、long int、long long int及对应unsigned类型的取值范围
- CHAR_BIT 定义byte与bit的换算关系,1 byte = 8 bit
- SHRT_MAX/MIN 定义short型取值范围
- USHRT_MAX 定义unsigned short型最大值,最小值为0
- INT_MAX/MIN 定义int型取值范围
- UINT_MAX 定义unsigned int最大值,最小值为0
- LONG_MAX/MIN 定义long int的取值范围
- ULONG_MAX 定义unsigned long int型的最大值,最小值为0
- NAME_MAX
- CHAR_MAX
<math.h>: 定义了基本的数学函数,返回值及参数类型全部为double型
- double sqrt(double x); 返回x的平方根
- double fabs(double x); 返回x的绝对值
- double fmod(double x, double y); 返回x除以y的余数;
- double ceil(double x); 返回大于或等于x的最小整数值
- double floor(double x); 返回小于或等于x的最大整数值
- double pow(double x, double y); 返回x的y次幂(次方)
- double log(double x); 返回x的自然对数,即基数为e的对数
- double log10(double x); 返回x的常用对数,即基数为10的对数
<signal.h>:处理或生成信号
- int raise(int sig); 生成sig变量指定的信号
- kill
- sigaction
- sigsuspend
- sigpending
- sigaddset
- sigemptyset
- sigfillset
- sigdelset
- sigismember
- sigprocmask
<stdarg.h>:用于处理函数的可变参数
- va_list 头文件中定义的变量数据类型,适用于以下三个宏
- void va_start(va_list ap, last_arg); 这个宏初始化ap变量,last_arg是最后一个传递给函数的固定参数(即省略号 ... 之前的参数,代表可变参数的数量)
- type va_arg(va_list ap, type); 检索可变参数列表中类型为type的下一个参数,通常与左值类型相同
- void va_end(va_list ap); 结束操作,释放资源
<stdio.h>:I/O库
- 数据类型
- size_t 库定义的变量数据类型,常用于 sizeof() 的结果
- FILE 代表文件流指针对象的数据类型
- 宏
- _IOFBF / _IOLBF / _IONBF fully buffered、line buffered、unbuffered,适用于 setvbuf 函数的第三个参数
- BUFSIZ 代表 setvbuf 函数使用的缓冲区大小
- FOPEN_MAX 代表系统可以同时打开的文件数量
- FILENAME_MAX 代表字符数组可以存储的文件名称的最大长度
- L_tmpnam 代表字符数组可以存储的由 tmpnam 函数创建的文件名称的最大长度
- SEEK_CUR / SEEK_SET / SEEK_END 在fseek 函数中,用于定位文件中的不同位置:当前位置、文件开头、文件末尾
- TMP_MAX 代表 tmpnam 函数可生成的临时文件名的最大数量
- stderr/stdin/stdout 代表标准错误、标准输入、标准输出
- 函数
- int fclose(FILE *stream); 关闭流stream,将相关的缓冲区全部内容送交内核处理
- void clearerr(FILE *steam); 清除文件结束或相关错误的标识
- int feof(FILE *stream); 测试流的文件结束标识符
- int ferror(FILE *stream); 测试 stream 的文件错误标识符
- int fflush(FILE *stream); 刷新 stream 的输出缓冲区,fclose() 执行时同样操作
- FILE *fopen(const char *filename, const char *mode); 使用指定的模式打开指定的文件:r、r+、w、w+、rb、wb等
- size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 从 stream 中读取以 size 为基本单位的 nmemb 数量的数据到 ptr 所指向的数组中
- size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream); 从 ptr 所指向的数组中,以 size 为基本单位的 nmemb 数量的数据写到 stream 中
- FILE *reopen(const char *filename, const char *mode, FILE *stream); 文件指针重定向
- int fseek(FILE *stream, long int offset, int whence); 将当前文件指针基于 whence 位置移动 offset 字节
- long int ftell(FILE *stream); 返回 stream 的当前位置
- int remove(const char *filename); 删除文件名称,使其不再被访问
- int rename(const char *old_filename, const char *new_filename); 重命名
- void rewind(FILE *stream); 将文件指针位置重置为文件开头
- void setvbuf(FILE *stream, char *buffer, int mode, size_t size); 定义用户空间缓冲区
- FILE *tmpfile(void); 以二进制模式 wb+ 创建临时文件
- char *tmpnam(char *str); 生成并返回一个临时文件名,这个名称之前是不存在的
- void perror(const char *str); 将错误描述信息发送至 stderr ,首选输出字符串 str ,后跟一个冒号和空格
- int fprintf(FILE *stream, const char *format, ...); 发送格式化输出到 stream 中
- int vfprintf(FILE *stream, const char *format, va_list arg); 使用参数列表 arg 发送格式化输出到 stream 中
- int sprintf(char *str, char *format, ...); 发送格式化输出到字符串 str 中
- int vsprintf(char *str, char *format, va_list arg); 使用参数列表 arg 发送格式化输出到 stream 中
- int printf(const char *format, ...); 相当于 fprintf(stdout, const char *format, ...);
- int vprintf(const char *format, va_list arg); 相当于 vfprintf(stdout, const char *format, va_list arg);
- int fscanf(FILE *stream, const char *format, ...); 从字节流 stream 中读取格式化输入
- int sscanf(const char *str, const char *format, ...); 从字符串 str 中读取格式化输入
- int scanf(const char *format, ...); 相当于 fscanf(stdin, const char *format, ...);
- int fgetc(FILE *stream); 从 stream 中读取一个字符,并将文件指针往前移动一个字节
- char *fgets(char *str, int n, FILE *stream); 从流 stream 中读取 n-1 个字符到字符串指针 str 所指向的字符串数组中,最后一字节添充 \0;遇到 \n 或 到达文件末尾会停止读取
- int fputc(int char, FILE *stream); 把指定字符写入到 stream 中
- int fputs(const char *str, FILE *stream); 将字符串写入到 sream 中,不包含 \0
- int putchar(int char); 将一具字符输出到 stdout 中
- int getchar(void); 从 stdin 中接收一个字符
- int ungetc(int char, FILE *stream); 把一个字符重新放回到 stream 中,相当于辙消 fgetc(FILE *stream) 的一步操作;单次操作保证成功,多次操作不一定成功
- temfile
<stdlib.h>:通用工具库
- 变量
- environ
- 宏
- EXIT_FAILURE 用于 exit() 函数的参数,表示程序执行失败
- EXIT_SUCCESS 用于 exit() 函数的参数,表示程序执行成功
- RAND_MAX 表示 rand() 函数能返回的最大值
- 函数
- double atof(const char *str); 将字符串 str 的字面值转换为 double 型数值,相当于直接去除类似 “123.45” 两边的引号 “
- long int atol(const char *str); 同上,转换为 long int 型
- int atoi(const char *str); 同上,转换为 int 型
- void *calloc(size_t n, size_t size); 为一个包含 n 个元素(每个元素大小为 size 字节,故分配出的总空间大小为 n * size)的数组分配内存空间,并将所有元素初始化为0,返回该内存空间的指针
- void *malloc(size_t size); 为任一对象分配总大小为 size 字节的内存空间,不做初始化,返回指向分配出的内存空间的指针
- void *realloc(void *ptr, seze_t size); 将之前由 calloc 或 malloc 分配的内存空间重新调整为 size 个字节的大小
- void free(void *ptr); 释放之前由 calloc 或 malloc 或 realloc 分配的内存空间
- void abort(void); 使一个程序以异常状态终止
- int atexit(void (*func)(void)); 程序正常终止之前调用 func 函数
- int exit(int status); 使一个程序正常终止,并返回 status 给操作系统
- char *getenv(const char *env_name); 搜索 env_name 所指向的环境变量,返回变量值到一个字符串中
- int system(const char *string); 执行外部系统 shell 命令
- int abs(int x)/long int abs(long int x); 整数绝对值,对于更大的数值对象,可使用 math.h 中的 double fabs(double x);
- int rand(void); 返回 0 至 RAND_MAX 之间的伪随机数
- void srand(unsigned int seed); 用于 rand() 函数的随机数发生器,通常以 time(NULL) 作为参数,即以自197001010000至今的秒数表示动态时间
- void qsort(void *base, size_t nterms, size_t size, int (*compar)(const void *, const void *)); 对 base 所指向的数组,按 compar 函数定义的规则,以快速排序算法进行排序,compar 函数需要自行定义
-
compar 函数示例: struct test{ int x; int y; }; int compar(struct test *a, struct test *b) /*若返回值大于 0,则 qsort 函数会把 a 排在 b 的后面;若返回值小于 0 , a 将排在 b 的前面*/ { if(a->x == b->x) { return (a->y - b->y); /*若 x 项相等,再以 y 项为标准进行排列,升序;若返回项改为 return (b->y - a->y),将进行降序排列*/ } else { return (a->x - b->x); } }
- void *bsearch(const void *key, void *base, size_t nterms, size_t size, int (*compar)(const void *, const void *)); 通常用途:在由 qsort 排序过的数组中以二分查找法查找与 key 相匹配的内容,返回第一个匹配项的位置指针,若目标数组中存在多个匹配项,则返回结果不确定是哪一个;查找目标 base 数组必须是事先排好序的,且必须与 compar 函数的排序逻辑一致
- mkstemp
- getenv
- putenv
<string.h>:字符串相关函数
- 函数
- void *memchr(const void *s, int c, size_t n); 查询 s 的前 n 个字节中,首次匹配字符 c 的位置,mem 类函数可作用于所有对象,str 类函数只能作用于字符串数组
- void *memrchr(const void *s, int c, size_t n); _GNU_SOURCE,Linux 特有,功能与memchr类似,但查询范围为 s 的最后 n 个字节
- int memcmp(const void *s1, const void *s2, size_t n); 比较 s1 和 s2 前 n 个字节的大小关系
- void *memcpy(void *dest, const void *src, size_t n); 从 src 中复制 n 个字节到 dest 中
- void *memmove(void *dest, const void *src, size_t n); 功能与 memcpy 基本相同,但可以保证当 src 和 dest 有重叠的时候得到正确的结果,效率低于memcpy
- void *memset(void *s, int c, size_t n); 将 s 的前 n 个字节的内容全部设置(替换)为 c
- char *strcat(char *dest, const char *src); 将 src 的所有内容追加到 dest 的结尾,dest 必须足够大以容纳 src 与 dest 的总长度
- char *strncat(char *dest, const char *src, size_t n); 将 src 的前 n 个字节的内容追加到 dest 的结尾
- int strcmp(const char *s1, const char *s2); 比较两具字符串的大小关系
- int strncmp(const char *s1, const char *s2, size_t n); 比较两个字符串前 n 个字节的大小关系
- char *strcpy(char *dest, const char *src); 字符串复制
- char *strncpy(char *dest, const char *src, size_t n); 将 src 中的前 n 个字节复制到 dest
- size_t strcspn(const char *s, const char *reject); 返回字符串 s 中(从开头计算)不包含在 reject 中的连续字符数(字节长度)
- size_t strspn(const char *s, const char *accept); 返回字符串 s 中(从开头计算)包含在 accept 中的连续字符数(字节长度)
- char *strerror(int errnum); 显示错误代码的文本信息
- size_t strlen(const char *s); 显示字符串长度(不包括 \0)
- char *strpbrk(const char *s, const char *accept); 检索 s 中第一个存在于 accept 中的字符位置,其值等于 strapn() 函数的结果加1
- char *strrchr(const char *s, int c); 检索 c 在 s 中最后一次出现的位置
- char *strchr(const char *s, int c); 检索 c 在 s 中第一次出现的位置
- char *strstr(const char *haystack, const char *needle); 检索 needle 在 haystack 中第一次出现的位置(不计算空字符 \0)
- char *strsep(char **stringp, const char *delim); _DEFAULT_SOURCE,Linux特有,将字符串 string 按 delim 中列出的分割符进行分割(可以按空白分割),直到 stringp 为 NULL,则返回 NULL,循环调用即可得到分割后的每个字段
- char *strtok(char *str, const char *delim); 标准库自带函数,与 strsep() 功能类似,但不能以空白类字符分割,且效率较低,存在 BUG
- char *strdup(const char *s); 将常量字符串 s 转变为字符数组(即从只读内存区复制到变量区),通常用于指针操作
- char *strndup(const char *s, size_t n); 将常量字符串 s 的前 n 个字节转变为字符数组,通常用于指针操作
<time.h>:操作日期、时间
- 数据类型
- clock_t
- time_t
- struct tm
-
struct tm { int tm_sec; /*秒,范围 0 - 60*/ int tm_min; /*分钟,范围 0 - 59*/ int tm_hour; /*小时,范围 0 - 23*/ int tm_mday; /*月份中的第几天,范围 0 - 31*/ int tm_mon; /*月份,范围 0 - 11*/ int tm_year; /*自 1900 年起累加的年数,实际使用中通常在结果中加 1900*/ int tm_wday; /*一周中的第几天,范围 0 - 6*/ int tm_yday; /*一年中的第几天,范围 0 - 365*/ int tm_isdst; /*夏令时*/ };
- 宏
- CLOCKS_PER_SEC
- 函数
- clock_t clock(void); cpu时钟计时,不保证准确,因为会周期性置 0 ,使用时需结合 CLOCKS_PER_SEC 宏转换为秒
- char *ctime(const time_t *timer); 简易显示当前时间的文本信息(当地时间)
- struct tm *gmtime(const time_t *timer); 返回 timer 指定的时间的 UTC 时间 tm 结构体
- struct tm *localtime(const time_t *timer); 同 gmtime ,但转换为本地时区对应的信息
- time_t mktime(struct tm *timeptr); 将一个 UTC 时间的 tm 结构体转换为本地时区的 time_t 值
- time_t time(time_t *timer); 获取时间数据,通常给定 NULL 参数,表示当前时间(距离 1970-01-01 00:00:00 的秒数)
HADEX_ FROM HELL.