##1. 说明
“stdlib.h”头文件即标准库头文件(standard library),stdlib 头文件里包含了C语言的最常用的系统函数。而C++中有对应相同作用的“cstdlib”头文件,当然C++中两个头文件都可以使用,C++向C兼容。
这个头文件经常和标准输入输出头文件(stdio.h)弄混,其实很简单,从文件名就可以很容易辨析,stdlib(standard library)主要是声明定义了一些通用的系统函数(定义了五种类型、一些宏和通用工具函数)。而stdio(standard input & output)则是定义了一些标准输入输出函数接口,包括编译平台和文件等输入输出函数。
“stdlib.h”中包含:
五种类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;
宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等;
常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等。
##2. 笔试必掌握内容
五种类型和宏声明了解就行,而stdlib库中包含的一些通用系统函数还是很实用的。如果运用得当,会给你面试编程节省很多时间,并且让你程序看上去不那么臃肿。下面介绍一下stdlib头文件中需要掌握的函数:
1. malloc()/free()
这两个函数接口分别是C/C++中用来动态申请空间和释放自己申请的空间的函数。例如笔试题中需要给输入数据动态申请一段地址空间来存储,这样就不会像数组开头固定一段空间,从而造成空间利用上的浪费。详细用法见下面例子:
char* nzArr = (char*)malloc(sizeof(char)*10);
free(nzArr);
nzArr = NULL;
第一句动态申请了10个char类型大小的地址空间,由于malloc函数返回的是void类型,所以在赋给某个指针的时候需要强制转换。这里指针是指向char类型,所以转换到对应类型地址空间。最后释放完毕之后,最好再将指针赋值给NULL,否则容易造成野指针的现象。
关于动态申请空间详细的介绍可以参考这篇博文:
http://blog.csdn.net/fx677588/article/details/52650101 关于C/C++动态申请空间释放和内存泄漏问题介绍
2. rand()/srand()
产生随机数函数,0到32767间的随机整数(0到0x7fff之间)。函数原型: int rand(void);
下面介绍产生0-99随机数的方法:
int nRand = rand()%100;
但是如果仅使用rand(),每次运行程序产生的随机数是一样的。所以需要结合srand(unsigned int send)为其提供种子seed。如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的。所以当结合time()设置种子点,每次运行会实实在在产生随机数。
程序如下:
#include<time.h>
unsigned int send = (unsigned)time(NULL);//当前时间作为种子点
srand(send); //为rand()提供种子点
int x = rand()%100; //获取0-99随机数
3. 字符串数组转其它类型相关函数
需要注意的是这里是字符串数组(char)转为其它类型数据,并不是C++“string”头文件中string类型转为其它类型数据。并且转换的字符串数组中串中的整数内容可由任何不是该整数的一部分的字符终止,如空白符、标点符号和字符等。*
3.1 atof
函数原型: double atof(char *str)
函数功能: 将字符串转换成一个双精度数值
函数返回: 转换后的数值
参数说明: str-待转换浮点型数的字符串
3.2 atoi
函数原型: int atoi(char *str)
函数功能: 将字符串转换成一个整数值
函数返回: 转换后的数值
参数说明: str-待转换为整型数的字符串
3.3 atol
函数原型: long atol(char *str)
函数功能: 将字符串转换成一个长整数
函数返回: 转换后的数值
参数说明: str-待转换为长整型的字符串
3.3 strtol/strtof/strtod
**函数功能:**分别是将字符串数组转换为长整数值、单浮点数、双浮点。
函数原型:
long int strtol(const char *nptr,char **endptr,int base);
float strtof(const char *nptr, char **endptr);
double strtod(const char *nptr,char **endptr);
参数说明:
strtol不仅可以识别十进制整数,还可以识别其它进制的整数,取决于base参数,base取值2~36。
endptr是一个传出参数,函数返回时指向后面未被识别的第一个字符。例如char *pos; strtol(“123abc”, &pos, 10);,strtol返回123,pos指向字符串中的字母a。如果字符串开头没有可识别的整数,例如char *pos; strtol(“ABCabc”, &pos, 10);,则strtol返回0,pos指向字符串开头,可以据此判断这种出错的情况,而这是atoi处理不了的。
使用举例:
char *nzArr = " 12356";
char *nzArr1 = " 123.22a56";
char *nzArr2 = " 21.222ab";
char *nzptr ;
long lNum = strtol(nzArr,&nzptr,10); //结果:12356
double dNum = strtod(nzArr1,&nzptr); //结果:123.22,nzptr指向a(未识别处)
double dAtof = atof(nzArr2); //结果:21.222
int nNum = atoi(nzArr); //结果:12356
##3. 包含的函数
1.abort
使程序立即非正常终止,一般不对缓冲区清仓。
2.abs/labs/llabs
返回num的绝对值。
3.assert
当表达式exp求值为0时,宏先向标准错误流stderr写错误信息,然后使程序非正常终止,否则,该宏无任何作用。当宏NDEBUG定义时,该宏的定义为空。
4.atexit
使得程序终止时调用由func指针指向的函数。如果成功注册,则函数返回0值,否则返回非0值。最少应允许注册32个终止函数,被注册的函数以注册的反序调用。
5.atof/atoi/atol/atoll
6.bsearch
函数对buf指向的已排序数组实施对分查找(binary search),返回与key指向的关键字匹配的第一个成员的指针。num说明数组中的元素数目,size指出每个元素占有的字节数。
7.div
函数返回numerator/denominator操作的商和余数,返回值的结构类型是div_t,该结构有以下两个域:int quot; int rem。
8.exit
该函数使程序立即正常终止,这意味着调用由atexit()注册的终止函数,并且清空和关闭任何打开的文件。
环境支持时,exit_code值传给调用进程。
9._Exit
该函数由C99增加。该函数类似于exit(),但有下列差别:
没有调用atexit()注册的函数;
没有调用signal()注册的信号处理程序;
打开的文件不必清空或关闭。
10.getenv
函数返回一个指针,指向实现定义的环境信息表中与name指向的串有关的环境信息。千万不要用代码修改该串。没有查到匹配数据时,返回空指针。
11.ldiv
函数返回numerator/denominator操作的商和余数,返回值的结构类型是ldiv_t,该结构有以下两个域:long int quot; long int rem;
12.lldiv
由C99增加,函数返回numerator/denominator操作的商和余数,返回值的结构类型是lldiv_t,该结构有以下两个域:long long int quot; long long int rem;
13.longjmp
使程序在最近一次调用setjmp()处重新执行。status变成setjmp()的返回值。
14.qsort
使用Quicksort算法对buf指向的数组进行排序,num是数组中元素的数目,size说明每个元素的大小(按字节)。
15.raise
把signal指定的信息传入执行中的程序。成功时返回0,否则返回非0值。
16.rand/srand
产生伪随机数序列,每次它被调用时返回一个0到RAND_MAX间的整数。RAND_MAX值至少是32767。
17.setjmp
在缓冲区envbuf中保存系统堆栈的内容,供longjmp()以后使用。
18.signal
注册由func指向的函数,作为signal所说明的信号的一个处理程序。
19.strtod/strtof/strtol/strtoll/strtold/strtoul/strtoull
strtold该函数由C99增加,处理类似于strtod(),只是它返回long double型值。 strtoll该函数由C99增加。处理类似于strtol(),只是它返回long long int型值。strtoul,把start指向的串中的数字表达式转换为无符号长整数。执行过程类似于strtol()。strtoull该函数由C99增加。处理类似于strtoul(),只是它返回unsigned long long int型值。
20.system
把str指向的串作为命令传入操作系统的命令处理程序。该函数与具体环境有关。
21.va_arg、var_copy、va_start及va_end
个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!