calloc
函数的 nmemb
参数
定义了几乎占整个标准库的三分之一的输入和输出函数、类型以及宏的数目。
除了几个用于 输入输出 的函数之外,下列函数用于处理与文件有关的操作。其中 size_t
类型是由运算符 sizeof 产生的无符号整类型。
函数名 | 说明 |
---|---|
remove | 用于删除参数指定的文件,这样,随后进行的打开该文件的操作将失败。如果失败,则返回一个非0值。 |
rename | 用于改变文件的名字。如果操作失败,则返回一个非0值。 |
tmpfile | 用于以方式 wb+ 创建一个临时文件,该文件在被关闭或程序正常结束时被自动删除。该函数的返回值为一个流;如果创建文件失败,则返回 NULL。 |
tmpnam | 用于创建一个不同于现存文件名字的字符串,并返回一个指向一内部静态数组的指针。 |
setvbuf | 用于控制参数所指定的流的缓冲区。在读、写以及其他任何操作之前必须调用此函数。 |
setbuf | 如果buf的值为NULL,那么参数所指定流的缓冲区将被关闭;否则 setbuf 函数等价于 (void) setvbuf(stream,buf,_IOFBF, BUFSIZ ) 。 |
头文件 ctype.h 中说明了一些用于测试字符的函数,以及用于字符的大小写转换的函数。
函数 | 说明 |
---|---|
isalnum© | 函数isalpha©或isdigit©为真。 |
isalpha© | 函数isupper©或islo we r©为真。 |
iscntrl© | c为控制字符。 |
isdigit© | c为十进制数字。 |
isgraph© | c是除空格外的可打印字符。 |
islower© | c是小写字母。 |
isprint© | c是包括空格的可打印字符。 |
ispunct© | c是除空格、字母和数字外的可打印字符。 |
isspace© | c是空格、换页符、换行符、回车符、横向制表符和纵向制表符。 |
isuppe r© | c是大写字母。 |
isxdigit© | c是十六进制数字。 |
‘)到0x7E(’~
’)之间的字符;控制字符是从0(’NUL
’)到0x1F(’US
’)之间的字符和字符0x7F(’DEL
’)。函数 | 说明 |
---|---|
int tolower(int c) | 把c转换为小写字母 |
int toupper(int c) | 把c转换为大写字母 |
如果c是一个大写字母,那么 tolower©返回对应的小写字母;否则返回c。如果c是一个小写字母,那么 toupper©返回对应的大写字母;否则返回 c。
在头文件 string.h 中定义了两组字符串函数。第一组函数的名字以 str
开头;第二组函数的名字以 mem
开头。只有函数 memmove 对重叠对象间的拷贝进行了定义,而其他函数则未对重叠对象间的拷贝进行定义。比较类函数将其参数视为 unsigned char 类型的数组。
函数名 | 说明 |
---|---|
strcpy | 用于把字符串 src (包括 \0 )拷贝到字符串 dest 当中,并返回 dest。 |
strncpy | 用于把字符串 src 中最多n个字符拷贝到字符串 dest 中,并返回 dest。 |
strcat | 用于把字符串 src 连接到 dest 的尾部,并返回 dest。 |
strncat | 用于把字符串 src 中最多n个字符连结到字符串 dest 的尾部,并以 \0 结束;返回 dest。 |
strcmp | 用于比较字符串 s1 和 s2。当 s1 < s2 时它返回一个负数;当 s1 > s2 t时它返回一个正数;当 s1==s2 时它返回0。 |
strncmp | 用于将字符串 s1 中至多n个字符与字符串 s2 相比较。 |
strchr | 用于返回一个指向字符串s中c字符第一次出现的位置的指针。如果s中不包含c,返回NULL。 |
strrchr | 用于返回一个指向字符串s中c字符最后一次出现的位置的指针。如果s中不包含c,返回NULL。 |
strspn | 用于返回字符串 s 中由字符串 accept 中的字符组成的第一个字串的长度。 |
strcspn | 用于返回字符串 s 中由不在字符串 reject 中的字符组成的第一个字串的长度。 |
strpbrk | 用于返回指向字符串 accept 中的任意字符第一次出现在字符串 s 中的位置的指针。 |
strstr | 用于返回指向字符串 needle 第一次出现在字符串 haystack 中的位置的指针。 |
strlen | 用于返回字符串 s 的长度。 |
strerror | 用于返回指向与错误序号 errnum 对应的错误信息字符串的指针。 |
strtok | 在 str 中搜索由 delim 中的分界符界定的单词。通过对它的一系列调用可以把字符串分成许多单词,这些单词以 delim 为界。 |
下面是一个 strcpy 的实现:
1 | char *strcpy(char *strDest, const char *strSrc) // 实现 strSrc 到 strDest 的复制 |
以 mem 开头的函数以字符数组的方式操作对象,其主要目的是提供一个高效的函数接口。
函数名 | 说明 |
---|---|
memcpy | 用于把字符串 src 中的 n 个字符拷贝到 dest 当中,并返回 dest。 |
memmove | 功能与 memcpy 相似,不同之处是当发生对象重叠时,该函数仍能正确执行。 |
memcmp | 用于把 s1 的前n个字符与 s2 相比较,其返回值与 strcmp 的返回值相同。 |
memchr | 用于返回指向 c 在 s 中第一次出现的位置指针。如果在 s 的前 n 个字符当中找不到匹配,那么返回 NULL。 |
memset | 用于把 s 中的前 n 个字符替换为 c ,并返回 s 。 |
头文件 math.h 中说明了数学函数和宏。
-lm
选项,因为数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm
选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。
宏 EDOM
和 ERANGE
(定义在头文件 error.h 中)是两个非 0 整常量,用于引发各个数学函数的定义域错误和值域错误; HUGE_VAL
是一个 double 类型的正数。当参数取值在函数的定义域之外时,就会出现定义域错误。在发生定义域错误时,全局变量 errno
的值被置为 EDOM
,函数的返回值视具体实现而定。如果函数的结果不能用 double 类型表示,那么就会发生值域错误。当结果上溢时,函数返回 HUGE_VAL
并带有正确的符号(正负号),errno
的值被置为 ERANGE
。当结果下溢时,函数返回 0,而 errno
是否被设置为 ERANGE
视具体实现而定。
在下列函数中,x和y的类型为double,n的类型为int,所有函数的返回值的类型均为double。三角函数的角度用弧度表示。
函数 | 说明 |
---|---|
sin(x) | \(x\)的正弦。 |
cos(x) | \(x\)的余弦。 |
tan(x) | \(x\)的正切。 |
asin(x) | \(sin^{-1}(x)\),值域为\([-\pi/2,\pi/2]\),其中 \(x \in [-1,1]\) 。 |
acos(x) | \(cos^{-1}(x)\),值域为\([0,\pi]\),其中x ∈ [-1,1]。 |
atan(x) | \(tan^{-1}(x)\),值域为\([-\pi/2,\pi/2]\)。 |
atan2 (y,x) | \(tan^{-1}(y/x)\),值域为\([-\pi,\pi]\)。 |
sinh(x) | \(x\)的双曲正弦。 |
cosh(x) | \(x\)的双曲余弦。 |
tanh( x) | \(x\)的双曲正切。 |
exp(x) | 幂函数\(e^x\)。 |
log(x) | 自然对数\(ln(x)\),其中\(x\gt{}0\)。 |
log10(x) | 以10为底的对数 \(log_{10}(x)\),其中 \(x\gt{}0\)。 |
pow(x,y) | \(x^y\)。如果 \(x=0\) 且\(y\le{}0\)或者如果 \(x\lt{}0\)且\(y\)不是整数,那么产生定义域错误。 |
sqrt(x) | \(x\)的平方根,其中\(x\ge{}0\)。 |
ceil(x) | 不小于\(x\)的最小整数,\(x\)的类型为double。 |
floor(x) | 不大于\(x\)的最大整数,\(x\)的类型为double。 |
fabs(x) | 绝对值$ |
ldexp(x,n) | \(x\dot{}2^n\)。 |
frexp(x,int *exp) | 把\(x\)分成一个在 \([1/2, 1)\) 区间的真分数和一个 2 的幂数。将真分数返回,幂数保存在 *exp 中。如果 \(x\) 为0,那么这两部分均为 0。 |
modf(x,double *ip) | 把x分成整数和小数两部分,两部分均与 \(x\) 有相同的正负号。函数返回小数部分,整数部分保存在 *ip 中。 |
fmod(x,y) | 求 \(x/y\) 的浮点余数,符号与 \(x\) 相同。如果 y 为 0 ,那么结果由具体实现而定。 |
一个非常实用的标准库。头文件 stdlib.h 中定义了用于数值转换、内存分配以及具有其他相似任务的若干函数。
函数名 | 说明 |
---|---|
atof | 用于把 nptr 所指向的字符串数组转换成double类型。该函数等价于 strtod(s, (char**)NULL) 。 |
atoi | 函数用于把 nptr 所指向的字符串数组转换成int类型;该函数等价于(int)strtol(s, (char**)NULL, 10)。 |
atol | 用于把 nptr 所指向的字符串数组转换成long类型;该函数等价于strtol(s, (char**)NULL, 10) |
strtod | 用于把 nptr 所指向的字符串数组的前缀转换成 double 类型,在转换时跳过字符串数组的前导空白符。 |
strtol | 用于把 nptr 所指向的字符串数组的前缀转换成 long 类型,在转换时跳过字符串数组的前导空白符。 |
strtoul | strtoul函数的功能与strtol函数相同,只是结果为 unsigned long 类型,错误值为 ULONG_MAX 。 |
strtol是atoi的增强版,主要体现在这几方面:
strtol("0XDEADbeE~~", NULL, 16)
返回0xdeadbee的值,strtol("0777~~", NULL, 8)
返回0777的值。char *pos; strtol("123abc", &pos, 10);
,strtol返回123,pos指向字符串中的字母a。如果字符串开头没有可识别的整数,例如char *pos; strtol("ABCabc", &pos, 10);
,则strtol返回0,pos指向字符串开头,可以据此判断这种出错的情况,而这是atoi处理不了的。strtol("0XDEADbeef~~", NULL, 16)
返回0x7fffffff并设置errno为ERANGE。回想一下使用fopen的套路if ( (fp = fopen(…)) == NULL) { 读取errno },fopen在出错时会返回NULL,因此我们知道需要读errno,但strtol在成功调用时也可能返回0x7fffffff,我们如何知道需要读errno呢?最严谨的做法是首先把errno置0,再调用strtol,再查看errno是否变成了错误码。Man Page上有一个很好的例子:
1 |
|
函数名 | 说明 |
---|---|
rand | 用于产生一个 0 到 RAND_MAX 之间的伪随机整数。RAND_MAX 的取值至少为 32767。 |
srand | 播种函数。用参数 seed 作为生成新的伪随机数序列的种子。种子 seed 的初值为1。 |
可以认为rand()在每次被调用的时候,它会查看:
一个常用的生成伪随机数的方法是结合time函数作为种子:
1 |
|
函数名 | 说明 |
---|---|
malloc | 用于为大小为 size 的元素分配足够的内存,并返回指向所分配区域的第一个字节的指针;若内存不足以满足要求,则返回 NULL。malloc并不负责把分配的内存空间清零。 |
calloc | 用于为由 nmemb 个大小为 size 的元素组成的数组分配足够的内存,并返回指向所分配区域的第一个字节的指针。并且calloc负责把这块内存空间用字节0填充。若内存不足以满足要求,则返回 NULL。该空间的初始大小为0字节。 |
realloc | 用于将 ptr 所指向的元素的大小改为 size 个字节。如果size比原来小,则前size个字节不变,后面的数据被截断,如果size比原来大,则原来的数据全部保留,后面长出来的一块内存空间未初始化(realloc不负责清零)。若不能满足要求,则返回NULL,在这种情况下,原p指向的内存区保持不变。 |
free | 用于释放p所指向的内存空间;当 ptr 的值为 NULL 时,该函数不起作用。 |
函数名 | 说明 |
---|---|
abort | 用于使程序非正常终止。其功能与 raise(SIGABRT) 类似 |
exit | 用于使程序正常终止。此时,所有已打开的文件被刷新,所有已打开的流被关闭,控制返回给环境。 |
atexit | 用于注册在程序正常终止时所要调用的函数。如果注册失败,那么返回非0值。 |
函数名 | 说明 |
---|---|
system | 用于把字符串 command 传送给执行环境。 |
getenv | 用于返回与变量有关的环境字符串。如果该字符串不存在,那么返回 NULL。 |
函数名 | 说明 |
---|---|
bsearch | 用于在 base[0]…base[n-1]之间查找与 *key 匹配的项。 |
qsort | 用于对由 n 个大小为 size 的元素构成的数组 base 进行升序排序。 |
qsort_r | 和 qsort 相似,区别是多了第三个参数 arg 用来传入比较函数,因而达到线程安全。 |
abs | 返回其 int 类型参数 j 的绝对值 |
labs | 返回其 long 类型参数 j 的绝对值 |
div | 用于求 numerator/denominator 的商和余数,并把结果分别保存在结构类型 div_t 的两个 int 类型的数 quot 和 rem 中。 |
ldiv | 用于求 numerator/denominator 的商和余数,并把结果分别保存在结构类型 div_t 的两个 long 类型的数 quot 和 rem 中。 |
assert
宏用于为程序增加诊断功能。
1 | void assert(int expression) |
当assert(expression)
执行时,如果表达式的值为0,那么 assert
宏将在标准出错输出流 stderr
输出一条如下所示的信息:
1 | Assertion failed: 表达式, file 文件名, line nnn |
然后调用 abort
终止执行。其中的源文件名和行号来自于预处理程序宏 __FILE__
和 __LINE__
。
如果在头文件 assert.h 被包含时定义了宏 NDEBUG
,那么宏 assert
将被忽略。
头文件 stdarg.h 提供了依次处理含有未知数目和类型的函数参数列表的功能。
假设函数 f 含有可变数目的参数, lastarg 是它的最后一个有名参数,然后在 f 内说明一个类型为 va_list
的变量 ap,它将依次指向每个参数:
1 | va_list ap; |
在访问任何未命名的参数前必须用 va_start
宏对 ap 进行初始化:
1 | va_start( va_list ap, lastarg); |
此后,宏 va_arg
的每次执行将产生一个与下一个未命名的参数有相同类型和值的值,它同时还修改 ap,以使下一次使用 va_arg
时返回下一个参数:
1 | type va_arg(va_list ap, 类型); |
当所有的参数被处理完毕之后 f 要退出执行以前,必须调用一次宏 va_end
:
1 | void va_end(va_list ap); |
头文件 setjmp.h 中的说明提供了一种避免通常的函数调用和返回顺序的途径,特别地,它允许立即从一个多层嵌套的函数调用中返回。
1 | int setjmp(jmp_buf env) |
setjmp 宏用于把当前状态信息保存到 env 中,供以后 longjmp 函数恢复状态信息时使用。如果是直接调用 setjmp,那么返回值为 0;如果是由于调用 longjmp 而调用 setjmp,那么返回值非 0。
setjmp 只能在某些特定的情况下调用,如在if语句、 switch语句及循环语句的条件测试部分以及一些简单的关系表达式中:
1 | if (setjmp(env) == 0) |
longjmp用于恢复由最近一次调用 setjmp 时所保存到 env 中的状态信息。当它执行完时,程序就像 setjmp 宏调用刚刚执行完并返回非 0 值val那样继续执行。包含 setjmp 宏调用的函数的执行不必已经终止。所有可访问的对象的值都与调用 longjmp 时相同,唯一的例外是,那些调用 setjmp 宏的函数中的非 volatile 自动变量如果在调用 setjmp 宏后有了改变,那么就变成未定义的。
头文件 signal.h 中提供了一些用于处理程序运行期间所引发的异常条件的功能,如处理来源于外部的中断信号或程序执行期间出现的错误等异常事件。
signal 用于确定处理以后的信号的方法。
1 | void (*signal(int sig, void (*handler)(int))) (int) |
如果 handler 的值是 SIG_DFL
,那么就采用由实现定义的缺省行为;如果 handler 的值是 SIG_IGN,那么就忽略该信号;否则,调用 handler 所指向的函数(参数的类型为信号的类型)。有效的信号包括:
信号名 | 说明 |
---|---|
SIGABRT | 异常终止,如由abort发出的信号。 |
SIGFPE | 算术运算出错,如除数为 0 或溢出。 |
SIGILL | 非法函数映像,如非法指令。 |
SIGINT | 交互式意图,如中断。 |
SIGSEGV | 非法访问存储器,如访问不存在的内存单元。 |
SIGTERM | 发送给本程序的终止请求信号 |
signal 对指定信号返回 handler 的前一个值;如果出现错误,那么返回值为SIG_ERR
。当随后出现信号 sig 时,该信号被恢复为其缺省行为,然后调用信号处理函数,如(*handl er)(sig)
。如果从信号处理程序中返回,那么程序就从发信号时的位置重新开始执行。
信号的初始状态由实现定义。
raise用于向程序发送信号 sig。如果发送不成功,就返回一个非 0 值。
1 | int raise(int sig) |
头文件 time.h 中说明了一些用于处理日期与时间的类型和函数。
头文件 time.h 中说明了一些用于处理日期与时间的类型和函数。其中的一部分函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同。 clock_t
和 time_t
是两个用于表示时间的算术类型,而 struct tm
则用于存放日历时间的各个成分。 tm
的各个成员的用途及取值范围如下:
变量 | 说明 |
---|---|
int tm_sec | 从当前分钟开始经过的秒数( 0,61)。 |
int tm_min | 从当前这小时开始经过的分钟数( 0,59)。 |
int tm_hour | 自午夜(0,23)。 |
int tm_mday | 本月中的天数( 1,31)。 |
int tm_mon | 从1月起经过的月数( 0,11)。 |
int tm_year | 从1900年起经过的年数。 |
int tm_wday | 从星期天起经过的天数( 0,6)。 |
int tm_yday | 从1月1日起经过的天数( 0,365)。 |
int tm_isdst | 夏令时标记。 |
其中,tm_is dst
在使用夏令时时其值为正,在不使用夏令时时其值为 0 。如果该信息不能使用,那么 tm_isd st
的值为负。
函数名 | 说明 |
---|---|
clock | 用于返回程序自开始执行到目前为止所占用的处理机时间。获取以秒为单位的时间可以用 clock() / CLOCKS_PER_SEC 。 |
time | 用于返回当前日历时间 |
difftime | 返回 time1-time0 的值(以秒为单位)。 |
mktime | 用于将结构 *tm 中的当地时间转换为 time_t 类型的日历时间(可被 time函数使用)。 |
asctime | 用于将结构 *tm 中的时间转换成如下所示的字符串形式。 |
ctime | 用于将结构 *timep 中的日历转换成当地时间。等效于asctime(localtime(tp)) |
gmtime | 用于将 *timep 中的日历时间转换成世界协调时(UTC)。 |
localtime | 用于将结构 *timep 中的日历时间转换成当地时间。 |
strftime | 用于根据 fomat 的值把结构 *tm 中的日期与时间信息转换成指定的格式并存储到 s 所指向的数组中。 |
strftime 函数用于根据 fomat 的值把结构 *tm 中的日期与时间信息转换成指定的格式并存储到 s 所指向的数组中。其中 fomat 类似于 printf 函数中的格式说明,它由 0 个或多个转换规格说明与普通字符组成。普通字符(包括终结行的空字符 \0
)都原封不动地拷贝到 s 中。每个 %c
按照下面所描述的格式用与当地环境相适应的值来替换。写到 s 中的字符数不得大于 max 。strftime函数返回实际写到s中的字符数(不包括空字符 \0
);如果所产生的字符数多于 max,该函数返回值为 0 。在 strftime 函数中可以使用的转换规格说明及其所表示的含义如下:
说明符 | 说明 |
---|---|
%a |
一星期中各天的缩写名。 |
%A |
一星期中各天的全名。 |
%b |
缩写月份名。 |
%B |
月份全名。 |
%c |
当地时间和日期表示。 |
%d |
用整数表示的一个月中的某一天(01~31)。 |
%H |
用整数表示的时(24小时制,00~23)。 |
%I |
用整数表示的时(12小时制,01~ 12)。 |
%j |
用整数表示的一年中各天(001~366)。 |
%m |
用整数表示的月份(01~12)。 |
%M |
用整数表示的分(00~59)。 |
%p |
与AM与PM对应的当地表示方法。 |
%S |
用整数表示的秒(00~61)。 |
%U |
用整数表示一年中的星期数(00~53,将星期日看作是每周的第一天)。 |
%w |
用整数表示一周中的各天(0~6,星期日为 0)。 |
%W |
用整数表示一年中的星期数(00~53,将星期一看作是每周的第一天)。 |
%x |
当地日期表示。 |
%X |
当地时间表示。 |
%y |
不带世纪号的年份(00~99)。 |
%Y |
完整年份表示(带世纪号)。 |
%Z |
时区名字(在可以使用时)。 |
%% |
% 本身。 |
头文件 limits.h 定义了一些于表示整类型大小的常量。以下所列的值是可接受的最小值,在实际系统中可以使用更大的值。
常量名 | 大小 | 说明 |
---|---|---|
CHAR_BIT |
8 | char类型的位数 |
CHAR_MAX |
UCHAR_MAX 或 SCHAR_MAX |
char类型的最大值 |
CHAR_MIN |
0 或 SCHAR_MIN |
char类型的最小值 |
INT_MAX |
+32767 | int类型的最大值 |
INT_MIN |
-32767 | int类型的最小值 |
LONG_MAX |
+2147483647 | long类型的最大值 |
LONG_MIN |
-2147483647 | long类型的最小值 |
SCHAR_MAX |
+127 | signed char类型的最大值 |
SCHAR_MIN |
-127 | signed char类型的最小值 |
SHRT_MAX |
+32767 | short类型的最大值 |
SHRT_MIN |
-32767 | short类型的最小值 |
UCHAR_MAX |
255 | unsigned char类型的最大值 |
UINT_MAX |
65535 | unsigend int类型的最大值 |
ULONG_MAX |
4294967295 | unsigned long类型的最大值 |
USHRT_MAX |
65535 | unsigned short类型的最大值 |
定义了与浮点算术运算相关的一些常量。下面列出的名字是 float.h 的一个子集,给出的每个值代表相应量的一个最小取值。各个实现可以定义适当的值。
常量名 | 大小 | 说明 |
---|---|---|
FLT_RADIX |
2 | 指数表示的基数,如 2、16 |
FLT_ROUNDS |
加法的浮点舍入规则 | |
FLT_DIG |
6 | 精度的十进制数字数 |
FLT_EPSILON |
1E-5 | 使 1.0+x != 1.0 成立的最小的 x |
xFLT_MANT_DIG |
基数为 FLT_RADIX 的尾数中的数字数 | |
FLT_MAX |
1E+37 | 最大浮点数 |
FLT_MAX_EXP |
使 \(\mbox{FLT_RADIX}^{n-1}\) 可表示的最大的 n | |
FLT_MIN |
1E-37 | 最小规范化的浮点数 |
FLT_MIN_EXP |
使 \(10^n\) 为规范化数的最小的n | |
DBL_DIG |
10 | 精度的十进制字数 |
DBL_EPSILON |
1E-9 | 使 1.0+x != 1.0 成立的最小的 x |
DBL_MANT_DIG |
基数为 FLT_RADIX 的尾数中的数字数 | |
DBL_MAX |
1E+37 | 最大双精度浮点数 |
DBL_MAX_EXP |
使 \(\mbox{FLT_RADIX}^{n-1}\) 可以正常表示的最大的 n | |
DBL_MIN |
1E-37 | 最小双精度浮点数 |
DBL_MIN_EXP |
使\(10^{n}\)为规范化数的最小的 n |