stdlib.h

头文件stdlib.h是一个大杂烩。它的函数可以分为六组,整型数学、算法、文本转换、多字节转换、存储分配、环境接口。
注意两个宏EXIT_FAILURE和EXIT_SUCCESS表示异常退出和正常退出(exit(EXIT_SUCCESS)一般等价于exit(0),exit(EXIT_FAILURE)一般等价于exit(1))。还有一个宏,我们一定不陌生,那就是RAND_MAX,展开为整值常量表达式,表示rand函数返回的最大值。MB_CUR_MAX展开为正整数表达式,表示当前区域设置(类型LC_CTYPE)指定的扩展字符集中多字节字符的最大字节数目,并且不会大于MB_LEN_MAX。
首先来看字符转换函数:

#include <stdlib.h>
double atof(const char *nptr);

函数atof把nptr指向的字符串的初始部分转换为double类型的表示。函数atof返回转换后的值。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *s1 = " 3.4sdf";
    char *s2 = "qwe 3.4sdf";
    printf("%f %f\n", atof(s1), atof(s2));
    return 0;
}

注意这段代码,第一个会正常输出,第二个出错输出0.0。3.4之前可以有空格但是一定不能有其他字符,不然就会出错。

#include <stdlib.h>
int atoi(const char *nptr);

和atof一样的原理,只不过这里是将字符串的初始部分转换为int表示。

#include <stdlib.h>
long int atol(const char *nptr);

函数atol把nprt指向的字符串的初始部分转换为long int表示。原理同atof。

#include <stdlib.h>
double strtod(const char *nptr, char **endptr);

函数strtod把nptr指向的串的初始部分转换为double表示。如果存在转换后的值,函数strtod就返回这个值。如果没有执行转换就返回0.如果正确的转换值在可表示值的范围之外,则返回正的或者负的HUGE_VAL,并将宏ERANGE的值存储在errno中。如果正确的转换值会造成下溢,则返回0,并将宏ERANGE存储在errno中。

#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);

函数strtol把nptr指向的串的初始部分转换为long int表示。如果存在转换后的值,函数strtod就返回这个值。如果没有执行转换就返回0.如果正确的转换值在可表示值的范围之外,则返回LONG_MAX或者LONG_MIN,并将宏ERANGE的值存储在errno中。

#include <stdlib.h>
unsigned int strtoul(const char *nptr, char **endptr, int base);

函数strtoul把nptr指向的串的初始部分转换为unsigned long int表示。如果存在转换后的值,函数strtod就返回这个值。如果没有执行转换就返回0.如果正确的转换值在可表示值的范围之外,则返回ULONG_MAX,并将宏ERANGE的值存储在errno中。

接下来是伪随机序列产生函数:

static unsigned long int next = 1;
#include <stdlib.h>
int rand(void)
{
    next = next * 1103515245 + 12345;
    return (unsigned int)(next / 65536) % 32768;
}

函数rand计算一个伪随机序列,范围是[0,RAND_MAX]。rand返回一个伪随机整数。注意现在的RAND_MAX是2147483647,而过去是32767(上面的代码是20几年前的了)。

#include <stdlib.h>
void srand(unsigned int seed)
{
    next = seed;
}

函数srand使用参数unsigned int seed作为新的伪随机数序列的种子。不使用srand设定种子而直接使用rand,相当于调用srand(1)(种子为1是默认的)。

再接着是内存管理函数:

#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);

函数calloc为nmemb个对象的数组分配空间,每个元素的大小为size,分配空间的所有为都被初始化为0(相当于使用malloc申请了同样大小的空间的之后,使用memset(p, ‘\0’, nmemb * size)对申请的空间进行初始化)。函数calloc返回一个空指针或者指向分配空间的指针。

#include <stdlib.h>
void *malloc(size_t size);

函数malloc为一个对象分配空间,其中,该对象的大小由size指定且对象的值是不确定的。函数malloc返回一个空指针或者指向分配空间的指针。

#include <stdlib.h>
void *realloc(void *ptr, size_t size);

函数realloc将ptr指向的对象的大小改变为由size指定的大小。新旧空间中较小的一个中的对象内容应该保持不变。设对象原来的大小为size1。如果size>size1,那么多出的部分的值是不确定的。如果ptr是一个空指针,那么对于一个指定的大小函数realloc的行为和malloc相同。如果不能分配空间,则ptr指向的对象不变。如果size是0而且ptr不是空指针,那么ptr指向的对象就会被释放。记住使用realloc之后就不能再使用原来的指向对象的指针了,必须使用realloc返回的指针,因为有可能对象的地址改变。

环境通信函数:

#include <stdlib.h>
void abort(void);

函数abort使程序异常终止。

#include <stdlib.h>
int atexit(void(*func)(void));

函数atexit注册func指向的函数,该函数在程序正常终止的时候被调用,而不需要任何参数。注册成功,函数atexit就返回0,否则返回非0.

#include <stdlib.h>
void exit(int status);

函数exit使程序的执行正常终止。首先调用所有atexit注册的函数,按照它们注册时的反顺序调用。然后,清空所有打开的具有未写缓冲数据的流,关闭所有打开的流,并删除tmpfile函数创建的所有文件。最后,控制权返回给宿主环境。注意函数exit不能返回到它的调用者。

#include <stdlib.h>
char *getenv(const char *name);

函数getenv搜索宿主环境提供的环境表,来查找一个能和name指向的串匹配的串。如果不能找到就返回一个空指针。

#include <stdlib.h>
int system(const char *string);

函数system把string指向的串传递给宿主环境,然后命令处理程序按照string的内容执行命令。

查找和排序函数:

#include <stdlib.h>
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

函数bsearch搜索一个nmemb个对象的数组,来查找和key指向的对象匹配的元素。base指向这个数组的第一个元素。数组中每个元素的大小由size指定。

#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

qosrt对指定的数组进行排序。

整数算术函数:

#include <stdlib.h>
int abs(int j);

函数abs计算整数j的绝对值,并返回绝对值。

#include <stdlib.h>
divt_t div(int numer, int denom);

函数div返回一个div_t类型的结构,该结构由商和余数构成。

#include <stdlib.h>
long int labs(long int j);

和abs原理相同。

#include <stdlib.h>
ldiv_t ldiv(long int numer, long int denom);

和div_t原理相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值