stdlib 头文件即standard library(标准库)头文件,里面包含了C、C++语言的最常用的系统函数。包括动态内存管理、随机数生成、与环境之间的通信、整数运算、搜索、排序及转换等。
stdlib .h 头文件定义了四个变量类型、五个宏和各种通用工具函数。
4个变量:
size_t
wchar_t(一个宽字符常量大小的整数类型)
div_t(div函数返回的结构)
ldiv_t(ldiv 函数返回的结构)。
5个宏:
NULL;
EXIT_FAILURE; exit 函数失败时要返回的值
EXIT_SUCCESS; exit 函数成功时要返回的值
RAND_MAX; rand 函数返回的最大值;
MB_CUR_MAX 在多字节字符集中的最大字符数
一些主要的函数
•atof函数
函数原型:double atof (const char* str);
函数描述:把参数 str 所指向的字符串转换为一个浮点数。
函数返回:函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。
特点:
1:函数会不理会字符串开始之后的空格,直到遇到第一个有效字符,从第一个有效字符开始,到最后一个有效字符为止,函数会将这段字符转换为浮点数。最后一个有效字符之后的字符不会影响该函数。
2:对于C90,有效字符包括以下条件:可以以+-字符作为字符串的开始;字符串中可以出现(不超过)一个.符;可以出现表示指数形式的E或e字符,且其后可以跟一个有效字符串。
3:对于C99/C11,除C90的条件外,还支持0x/0X前缀,INF,NAN等。
•atoi函数
函数原型:int atoi(const char *str);
函数描述:把参数 str 所指向的字符串转换为一个整数。
函数返回:返回转换后的长整数,如果没有执行有效的转换,则返回零。
特点:
1:函数会忽略字符串刚开始的空格,直到遇到第一个有效字符。
2:+和-位于第一个字符是被认为是有效字符。最后一个有效字符之后的字符不会影响该函数。
3:若转换后的数据长度超出int所表示的最大范围,将产生未定义的行为。
•atol函数
函数原型:long int atol(const char *str);
函数描述:把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。
函数返回:返回转换后的长整数,如果没有执行有效的转换,则返回零。
特点:与atoi一致。
•strtod函数
函数原型:double strtod(const char *str, char **endptr);
函数描述:把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
函数返回:返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。
特点:
1:函数会忽略字符串刚开始的空格,直到遇到第一个有效字符。
2:如果 endptr 不为空,则它指向转换中最后一个有效字符后的字符所在的地址。
3:实际使用中常将endptr设为null,表示不关注无效字符。
•strtol函数
函数原型:long int strtol(const char *str, char **endptr, int base);
函数描述:把参数 str 所指向的字符串根据给定的 base 转换为一个长整数,base 必须介于 2 和 36(包含)之间,或者是特殊值 0。
函数返回:函数返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。
特点:
1.对于base,若base为0,则要求:首字母可以是(+/-),若首字母不是0或0x/0X,则必须是十进制的其他字符,且按照10进制进行转换;若首字母是0或0x/0X,则分别按照8进制或16进制转换,开始的0及x/X会被忽略,在此过程中,超出8进制和16进制的字符会被认为是无效字符(如0912会被转化为0,因为会按照8进制来转换,9被认为是无效字符)。
2:若为36进制,则为从0~z/Z。
3:其余特点参考strtod。
•strtoul函数
函数原型:unsigned long int strtoul(const char *str, char **endptr, int base);
函数描述:把参数 str 所指向的字符串根据给定的 base 转换为一个无符号长整数,base 必须介于 2 和 36(包含)之间,或者是特殊值 0。
函数返回:返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。
特点:参考strtol
•calloc函数
函数原型:void *calloc(size_t nitems, size_t size);
函数描述:分配所需的内存空间,并返回一个指向它的指针。nitems表示要被分配的元素个数。size表示每个元素的大小。
函数返回:返回一个指针,指向已分配的内存。如果请求失败,则返回 NULL。
特点:
1:malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。
•free函数
函数原型:void free(void *ptr);
函数描述:释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。
函数返回:不返回任何值。
特点:
1:如果传递的参数是一个空指针,则不会执行任何动作。
2:如果指针指向的内存不是由calloc、malloc 或 realloc 所分配,则函数会发生未定义的结果。
3:函数不会改变指针的值(指向),只是现在指向的内存区域无效。(Notice that this function does not change the value of ptr itself, hence it still points to the same (now invalid) location.)
•malloc函数
函数原型:void *malloc(size_t size);
函数描述:分配所需的内存空间,并返回一个指向它的指针。size表示要申请的字节数。
函数返回:返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回NULL。
•realloc函数
函数原型:void *realloc(void *ptr, size_t size) ;
函数描述:尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
函数返回:返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回NULL。
特点:
1:ptr指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针(类似malloc)。
2:新的内存块的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。
3:如果请求失败,则返回NULL,此时不影响ptr所指向的内存。
•abort函数
函数原型:void abort(void);
函数描述:异常中止程序执行,直接从调用的地方跳出。
函数返回:无返回。
特点:
1:abort函数导致所有的流被关闭和冲洗。
2:abort函数用以解除进程对SIGABRT信号的阻止。
•atexit函数
函数原型:int atexit(void (*func)(void)) ;
函数描述:当程序正常终止时,调用指定的函数func。
函数返回:如果函数成功注册,则该函数返回零,否则返回一个非零值。
特点:
1:可以在任何地方注册你的终止函数,但它会在程序终止的时候被调用。
2:若一个程序中出现多次atexit函数,则其按照栈的方式执行(最后一个先执行,以此类推)。
•exit函数
函数原型:void exit(int status);
函数描述:(正常)立即终止调用进程。status – 返回给父进程的状态值。
对于status,如果其为0或者EXIT_SUCCESS,表示成功;如果其为EXIT_FAILURE,表示失败。
函数返回:无返回。
特点:
1:任何属于该进程的打开的文件描述符都会被关闭,该进程的子进程由进程 1 继承,初始化,且会向父进程发送一个 SIGCHLD 信号。
•getenv函数
函数原型:char *getenv(const char *name);
函数描述:搜索name所指向的环境字符串,并返回相关的值给字符串。
函数返回:返回一个以 null 结尾的字符串,该字符串为被请求环境变量的值。如果该环境变量不存在,则返回 NULL。
•system函数
函数原型:int system(const char *command);
函数描述:把 command 指定的命令名称或程序名称传给要被命令处理器执行的主机环境,并在命令完成后返回。
函数返回:如果发生错误,则返回值为-1,否则返回命令的状态。
特点:
1:如果command为null,则只是为了测试指令系统是否有效,若有效,返回非0,否则返回0。
•bsearch函数
函数原型:void bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void , const void *));
函数描述:对 nitems 对象的数组执行二分查找,base 指向进行查找的数组,key 指向要查找的元素,size 指定数组中每个元素的大小。数组的内容应根据 compar 所对应的比较函数升序排序。
函数返回:如果查找成功,该函数返回一个指向数组中匹配元素的指针,否则返回空指针。
特点:
1:对于compar函数,若返回值小于0,表示要查找的值小于当前值;若返回值等于0,表示要查找的值等于当前值;若返回值大于0,表示要查找的值大于当前值。
2:若数组中有多个满足条件的值,则函数可能返回任意一个,不一定是第一个。
3:复杂度log2(num)+2。
•qsort函数
函数原型:void qsort(void base, size_t nitems, size_t size, int (*compar)(const void , const void*));
函数描述:对数组进行排序。base指向要排序的数组的第一个元素的指针。nitems 由 base 指向的数组中元素的个数。size数组中每个元素的大小,以字节为单位。compar 用来比较两个元素的函数。
返回值:无返回值。
特点:
1:不稳定排序(其实是基于快速排序的操作)。
2:复杂度num*log2(num)。
•abs函数与labs函数
函数原型:int abs(int x);long int abs(long int x);
函数描述:取x得绝对值。
函数返回:返回x的绝对值。
特点:
1:对于浮点型及负数的取绝对值,分别定义在头文件cmath.h及头问价complex.h中。
•div函数与ldiv函数
函数原型:div_t div(int numer, int denom); div_t div(long int numer, long int denom);
函数描述:把 numer(分子)除以 denom(分母)。
函数返回:返回定义在
rand函数
函数原型:int rand(void) ;
函数描述:伪随机数生成函数。
函数返回:返回一个范围在 0 到 RAND_MAX 之间的伪随机数。
特点:
1:RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。
2:若随机数生成种子相同,则每次调用rand()生成的伪随机数是相同的。
3:若使用rand函数前没有调用srand函数,系统会自动调用srand函数。
•srand函数
函数原型:void srand(unsigned int seed);
函数描述:播种由函数rand使用的随机数发生器。seed是一个整型值,用于伪随机数生成算法播种。
函数返回:无返回。
特点:
1:不同的seed会使得此后调用rand函数生成不同的伪随机数。
2:如果seed设置为1,rand函数将生成和之前一样的伪随机序列。
3:为了保持seed的独特性,通常的做法是使用time函数返回作为seed值。如srand(time(&t));
此外,stdlib头文件还有一些处理多字节的函数,在使用过程中可自行查阅。
参考: