标准库函数
本附录描述了标准C支持的库函数①。使用此附录时,请记住下列要点。
z 为了简洁清楚,这里删除了一些细节。如果想看全部内容,请参考标准。本书的其他地方已经对
一些函数(特别是printf函数、scanf函数以及它们的变异函数)进行了详细介绍,所以这里
只对这类函数做简短的描述。为了获得关于某个函数更详细的信息(包括如何使用这个函数的示
例),请见函数描述右下角用楷体列出的节号。
z 每个函数描述结尾都有其他与之相关函数的列表。相似函数非常接近于正在描述的函数。相关函
数经常会和在描述的函数联合使用。(例如,calloc函数和realloc函数与malloc函数“类似”,
而free函数则与malloc函数“相关”。)也可参见的函数和在描述的函数没有紧密联系,但是却
可能有影响。
z 如果把函数行为的某些方面描述为由实现定义的,那么这就意味着此函数依赖于C库的实现方式。
函数将始终行为一致,但是结果却可能会由于系统的不同而千差万别。(换句话说,请参考手册了
解可能发生的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
。)另一方面,未定义的行为是一个不好的消息:不但函数的行为可能会因系统
不同而不同,而且程序也可能会行为异常甚至崩溃。
z
中许多函数的描述提到了定义域错误和取值范围错误。在本附录的末尾对这两种错误
进行了定义。
z 下列库函数的行为是会受到当前地区影响的:
字符处理函数(除了isdigit函数和isxdigit函数)。
格式化输入/输出函数。
多字节字符和字符串函数。
字符串转换函数。
Strcoll函数、strftime函数和strxfrm函数。
例如,isalpha函数实际上检测字符是否在a到z之间或者在A到Z之间。在某些区域内也把
其他字符看成是字母次序的。本附录描述了在"C"(默认的)地区内库函数的行为。
z 一些函数实际上是宏。然而,这些宏的用法和函数完全一样,所以这里不对它们区别对待。
abort 异常终止程序
void abort(void);
产生SIGABRT信号。如果无法捕获信号(或者如果信号处理函数返回),那么程序会异常
终止,并且返回由实现定义的代码来说明不成功的终止。是否清洗输出缓冲区,是否关
闭打开的流,以及是否移除临时文件都是由实现定义的。
相似函数 exit函数、raise函数
相关函数 assert函数、signal函数
也可参见 atexit函数 26.2节
abs 整数的绝对值
int abs(int j);
返回 整数j的绝对值。如果不能表示j的绝对值,那么函数的行为是未定义的。
① 这些材料经ANSI许可改编自American National Standards Institude ANSI/ISO 9899©1990。这个标准的副本可从
ANSI购买(ANSI, 11 West 42nd Street, New York, NY 10036)。
附录D
601
附录 D 标准库函数 419
相似函数 fabs函数、labs函数 26.2节
acos 反余弦
double acos(double x);
返回 x的反余弦值。返回值的范围在0到π之间。如果x的值不在−1到+1之间,那么就会发生定
义域错误。
相关函数 asin函数、atan函数、atan2函数、cos函数、sin函数、tan函数 23.3节
asctime 把日期和时间转换成ASCII码
char *asctime(const struct tm *timeptr);
返回 指向以空字符结尾的字符串的指针,其格式如下所示:
Mon Jul 15 12:30:45 1996\n
此格式的构造来源于timeptr指向的结构中的分解时间。
相似函数 ctime函数、strftime函数
相关函数 diffime函数、gmtime函数、localtime函数、mktime函数、time函数 26.3节
asin 反正弦
double asin(double x);
返回 x的反正弦值。返回值的范围在-π/2到π/2之间。如果x的值不在-1到+1之间,那么就会发
生定义域错误。
相关函数 acos函数、atan函数、atan2函数、cos函数、sin函数、tan函数 23.3节
asserrt 诊断表达式的真值
void assert(int expression);
如果expression的值非零,那么assert函数什么也不做。如果expression的值为零,
那么assert函数向stderr写信息(说明expression的文本,含有assert函数的源文
件名,以及assert函数的行数),然后通过调用abort函数终止程序。为了使assert函
数无效,要在包含之前定义宏NDEBUG。
相关函数 abort函数 24.1节
atan 反正切
double atan(double x);
返回 x的反正切值。返回值的范围在−π/2到π/2之间。
相似函数 atan2函数
相关函数 acos函数、asin函数、cos函数、sin函数、tan函数 23.3节
atan2 商的反正切
double atan2(double y, double x);
返回 y/x的反正切值。返回值的范围在−π到π之间。如果x和y的值都为零,那么就会发生定义
域错误。
相似函数 atan函数
相关函数 acos函数、asin函数、cos函数、sin函数、tan函数 23.3节
atexit 在程序退出处注册要调用的函数
int atexit(void (*func)(void));
注册由func指向的函数作为终止函数。如果程序正常终止(通过return或exit,而不
是abort),那么将调用函数。可以重复调用atexit函数来注册多个终止函数。最后一
个注册的函数将是在终止前第一个被调用的函数。
返回 如果成功,返回零。如果不成功,则返回非零(达到由实现定义的限制)。
相关函数 exit函数
也可参见 abort函数 26.2节
atof 把字符串转换成浮点数
602
603
420 附录 D 标准库函数
double atof(const char *nptr);
返回 对应字符串最长初始部分的double型值,此字符串是由nptr指向的,且字符串最长初
始部分具有浮点数的格式。如果无法表示此数,那么函数的行为将是未定义的。
相似函数 strtod函数
相关函数 atoi函数、atol函数
也可参见 strtol函数、strtoul函数 26.2节
atoi 把字符串转换成整数
int atoi(const char *nptr);
返回 对应字符串最长初始部分的整数,此字符串是由nptr指向的,且字符串最长初始部分具
有整数的格式。如果无法表示此数,那么函数的行为将是未定义的。
相似函数 atol函数、strtol函数、strtoul函数
相关函数 atof函数
也可参见 strtod函数 26.2节
atol 把字符串转换成长整数
long int atol(const char *nptr);
返回 对应字符串最长初始部分的长整数,此字符串是由nptr指向的,且字符串最长初始部分
具有整数的格式。如果无法表示此数,那么函数的行为将是未定义的。
相似函数 atoi函数、strtol函数、strtoul函数
相关函数 atof函数
也可参见 strtod函数 26.2节
bsearch 二分检索
void *bsearch(const void *key, const void *base,
size_t memb, size_t size,
int (*compar)(const void *,
const void *));
在有序数组中搜索由key指向的值。其中,数组存储在base地址上,且此数组有nmemb
个元素,每个元素大小为size个字节。compar指向“比较函数”。换句话说当传递指向
关键字的指针和数组元素时,比较函数必须返回负整数、零或正整数,这主要依赖于关键
字是小于、等于还是大于数组元素。
返回 指向数组元素的指针,此数组元素是用来测试是否等于关键字的。如果没有找到关键字,
那么返回空指针。
相关函数 qsort函数 26.2节
calloc 分配并清除内存块
void *calloc(size_t nmemb, size_t size);
为带有nmemb个元素的数组分配内存块,其中每个数组元素占size个字节。通过设置所
有位为零来清除内存块。
返回 指向内存块开始处的指针。如果不能分配所要求大小的内存块,那么返回空指针。
相似函数 malloc函数、realloc函数
相关函数 free函数 17.3节
ceil 上整数
double ceil(double x);
返回 大于或等于x的最小整数。
相似函数 floor函数 23.3节
clearerr 清除流错误
void clearerr(FILE *stream);
为stream指向的流清除文件尾指示器和错误指示器。
相关函数 feof函数、ferror函数、rewind函数 22.3节
604
605
附录 D 标准库函数 421
clock 处理器时钟
clock_t clock(void);
返回 从程序开始执行起所经过的处理器时间(按照“时钟嘀嗒”来衡量的)。(用
CLOCKS_PER_SEC除以此时间来转换成秒。)如果时间无效或者无法表示,那么返回
(clock_t)-1。
相似函数 time函数
也可参见 difftime函数 26.3节
cos 余弦
double cos(double x);
返回 x的余弦值(按照弧度衡量的)。
也可参见 acos函数、asin函数、atan函数、atan2函数、sin函数、tan函数 23.3节
cosh 双曲余弦
double cosh(double x);
返回 x的双曲余弦值。如果x的数过大,那么可能会发生取值范围错误。
相关函数 sinh函数、tanh函数
也可参见 acos函数、asin函数、atan函数、atan2函数、cos函数、sin函数、
tan函数 23.3节
ctime 把日期和时间转换成字符串
char *ctime(const time_t *timer);
返回 指向字符串的指针,此字符串描述了本地时间,此时间等价于timer指向的日历时间。
等价于asctime(localtime(timer))。
相似函数 asctime函数、strftime函数
相关函数 difftime函数、gmtime函数、localtime函数、mktime函数、time函数 26.3节
difftime 时间差
double difftime(time_t time1, time_t time0);
返回 time0(较早的时间)和time1之间的差值,此值按秒来衡量。
相关函数 asctime函数、ctime函数、gmtime函数、localtime函数、mktime函数、strftime
函数、time函数
也可参见 clock函数 26.3节
div 整数除法
div_t div(int numer, int denom);
返回 含有quot(numer除以denom时的商)和rem(余数)的结构。如果无法表示结果,那
么函数的行为是未定义的。
相似函数 ldiv函数 26.2节
exit 退出程序
void exit(int status);
调用所有用atexit函数注册的函数,清洗全部输出缓冲区,关闭所有打开的流,移除任
何由tmpfile产生的文件,并终止程序。status的值说明程序是否正常终止。status
唯一可移植的值是0和EXIT_SUCCESS(两者都说明成功终止)以及EXIT_FAILURE(不
成功的终止)。status的其他值都是由实现定义的。
相似函数 abort函数
相关函数 atexit函数 9.5节、26.2节
exp 指数
double exp(double x);
返回 e的x次幂的值(即ex)。如果x的数过大,那么可能会发生取值范围错误。
相似函数 pow函数
相关函数 log函数
606
422 附录 D 标准库函数
也可参见 log10函数 23.3节
fabs 浮点数的绝对值
double fabs(double x);
返回 x的绝对值。
相似函数 abs函数、labs函数 23.3节
fclose 关闭文件
int fclose(FILE *stream);
关闭由stream指向的流。清洗保留在流缓冲区内的任何未写的输出。如果是自动分配,
那么就释放缓冲区。
返回 如果成功,就返回零。如果检测到错误,就返回EOF。
相关函数 fopen函数、freopen函数
也可参见 fflush函数 22.2节
feof 检测文件末尾
int feof(FILE *stream);
返回 如果为stream指向的流设置了文件尾指示器,那么返回非零值。否则返回零。
相似函数 ferror函数
相关函数 clearerr函数、fseek函数、rewind函数 22.3节
ferror 检测文件错误
int ferror(FILE *stream);
返回 如果为stream指向的流设置了文件错误指示器,那么返回非零值。否则返回零。
相似函数 feof函数
相关函数 clearerr函数、rewind函数 22.3节
fflush 清洗文件缓冲区
int fflush(FILE *stream);
把任何未写入的数据写到和stream相关的缓冲区中,其中stream指向用于输出或更新
的已打开的流。如果stream是空指针,那么fflush函数清洗存储在缓冲区中的所有未
写入的流。
返回 如果成功就返回零。如果检测到错误,就返回EOF。
也可参见 fclose函数、setbuf函数、setvbuf函数 22.2节
fgetc 从文件中读取字符
int fgetc(FILE *stream);
从stream指向的流中读取字符。
返回 读到的字符。如果fgetc函数遇到流的末尾,则设置流的文件尾指示器并且返回EOF。如
果读取发生错误,fgetc函数设置流的错误指示器并且返回EOF。
相似函数 getc函数、getchar函数
相关函数 fputc函数、putc函数、ungetc函数
也可参见 putchar函数 22.4节
fgetpos 获得文件位置
int fgetpos(FILE *stream, fpos_t *pos);
把stream指向的流的当前位置存储到pos指向的对象中。
返回 如果成功就返回零。如果调用失败,则返回非零值,并且把由实现定义的错误码存储到
errno中。
相似函数 ftell函数
相关函数 fsetpos函数
也可参见 fseek函数、rewind函数 22.7节
fgets 从文件中读取字符串
char *fgets(char *s, int n, FILE *stream);
607
608
附录 D 标准库函数 423
从stream指向的流中读取字符,并且把读入的字符存储到s指向的数组中。遇到第一个
换行符已经读取了n-1个字符,或到了文件末尾时,读取操作都会停止。fgets函数会在
字符串后添加一个空字符。
返回 s(指向数组的指针,此数组存储着输入)。如果读取操作错误或fgets函数在存储任何
字符之前遇到了流的末尾,都会返回空指针。
相似函数 gets函数
相关函数 fputs函数
也可参见 puts函数 22.5节
floor 向下取整
double floor(double x);
返回 小于或等于x的最大整数。
相似函数 ceil函数 23.3节
fmod 浮点模数
double fmod(double x, double y);
返回 x除以y的余数。如果y为零,是发生定义域错误还是fmod函数返回零是由实现定义的。
也可参见 div函数、ldiv函数 23.3节
fopen 打开文件
FILE *fopen(const char *filename, const char *mode);
打开文件以及和它相关的流,文件名是由filename指向的。mode说明文件打开的方式。
为流清除错误指示器和文件尾指示器。
返回 文件指针。在执行下一次关于文件的操作时会用到此指针。如果无法打开文件则返回空指针。
相似函数 freopen函数
相关函数 fclose函数、setbuf函数、setvbuf函数 22.2节
fprintf 格式化写文件
int fprintf(FILE *stream, const char *format, ...);
向stream指向的流写输出。format指向的字符串说明了后续参数显示的格式。
返回 写入的字符数量。如果发生错误就返回负值。
相似函数 printf函数、sprintf函数、vfprintf函数、vprintf函数、vsprintf函数
相关函数 fscanf函数
也可参见 scanf函数、sscanf函数 22.3节
fputc 向文件写字符
int fputc(int c, FILE *stream);
把字符c写到stream指向的流中。
返回 c(写入的字符)。如果写发生错误,fputc函数会为stream设置错误指示器,并且返回EOF。
相似函数 putc函数、putchar函数
相关函数 fgetc函数、getc函数
也可参见 getchar函数 22.4节
fputs 向文件写字符串
int fputs(const char *s, FILE *stream);
把s指向的字符串写到stream指向的流中。
返回 如果成功,返回非负值。如果写发生错误,则返回EOF。
相似函数 puts函数
相关函数 fgets函数
也可参见 gets函数 22.5节
fread 从文件读块
size_t fread(void *ptr, size_t size, size_t nmemb,
FILE *stream);
609
424 附录 D 标准库函数
试着从stream指向的流中读取nmemb个元素,每个元素大小为size个字节,并且把读入
的元素存储到ptr指向的数组中。
返回 实际读入的元素(不是字符)数量。如果fread遇到文件末尾或检测到读取错误,那么此
数将会小于nmemb。如果nmemb或size为零,则返回值为零。
相关函数 fwrite函数 22.6节
free 释放内存块
void free (void *ptr);
释放地址为ptr的内存块(除非ptr为空指针时调用无效)。块必须通过calloc函数、
malloc函数或realloc函数进行分配。
相关函数 calloc函数、malloc函数、realloc函数 17.4节
freopen 重新打开文件
FILE *freopen(const char *filrname, const char *mode,
FILE *stream);
在freopen函数关闭和stream相关的文件后,打开名为filename且与stream相关的文
件。Mode参数具有和fopen函数调用中相同的含义。
返回 如果操作成功,返回stream的值。如果无法打开文件则返回空指针。
相似函数 fopen函数
相关函数 fclose函数、setbuf函数、setvbuf函数 22.2节
frexp 分解成小数和指数
double frexp(double value, int *exp);
按照下列形式把value分解成小数部分f和指数部分n:
value = f × 2n
其中f是规范化的,因此0.5≤f<1或者f=0。把n存储在exp指向的整数中。
返回 f,即value的小数部分。
相关函数 ldexp函数
也可参见 modf函数 23.3节
fscanf 格式化读文件
int fscanf(FILE *stream, const char *format, ...);
向stream指向的流读入任意数量的数据项。format指向的字符串说明了读入项的格式。
跟在format后边的参数指向数据项存储的位置。
返回 成功读入并且存储的数据项数量。如果发生错误或在可以读数据项前到达了文件末尾,那
么就返回EOF。
相似函数 scanf函数、sscanf函数
相关函数 fprintf函数、vfprintf函数
也可参见 printf函数、sprintf函数、vprintf函数、vsprintf函数 22.3节
fseek 文件查找
int fseek(FILE *stream, long int offset, int whence);
为stream指向的流改变文件位置指示器。如果whence是SEEk_SET,那么新位置是在文
件开始处加上offset个字节。如果whence是SEEK_CUR,那么新位置是在当前位置加上
offset个字节。如果whence是SEEK_END,那么新位置是在文件末尾加上offset个字节。
对于文本流而言,offset必须是零,或者whence必须是SEEK_SET并且offset的值是
由前一次的ftell函数调用获得的。而对于二进制流来说,fseek函数不可以支持whence
是SEEK_END的调用。
返回 如果操作成功就返回零。否则返回非零值。
相似函数 fsetpos函数、rewind函数
相关函数 ftell函数
也可参见 fgetpos函数 22.7节
610
611
附录 D 标准库函数 425
fsetpos 设置文件位置
int fsetpos(FILE *stream, const fpos_t *pos);
根据pos(前一次fgetpos函数调用获得的)指向的值来为stream指向的流设置文件位
置指示器。
返回 如果成功就返回零。如果调用失败,返回非零值,并且把由实现定义的错误码存储在errno中。
相似函数 fseek函数、rewind函数
相关函数 fgetpos函数
也可参见 ftell函数 22.7节
ftell 确定文件位置
long int ftell(FILE *stream);
返回 返回stream指向的流的当前文件位置指示器。如果调用失败,返回-1L,并且把由实现定
义的错误码存储在errno中。
相似函数 fgetpos函数
相关函数 fseek函数
也可参见 fsetpos函数、rewind函数 22.7节
fwrite 向文件写块
size_t fwrite(const void *ptr, size_t size,
size_t nmemb, FILE *stream);
从ptr指向的数组中写nmemb个元素到stream指向的流中,且每个元素大小为size个字节。
返回 实际写入的元素(不是字符)的数量。如果fwrite函数检测到写错误,则这个数将会小
于nmemb。
相关函数 fread函数 22.6节
getc 从文件读入字符
int getc(FILE *stream);
从stream指向的流中读入一个字符。注意:getc函数通常是作为宏来实现的。它可能计
算stream不只一次。
返回 读入的字符。如果getc函数遇到流的末尾,那么它会设置流的文件尾指示器并且返回EOF。
如果读取发生错误,那么getc函数设置流的错误指示器并且返回EOF。
相似函数 fgetc函数、getchar函数
相关函数 fputc函数、putc函数、ungetc函数
也可参见 putchar函数 22.4节
getchar 读入字符
int getchar(void);
从stdin流中读入一个字符。注意:getchar函数通常是作为宏来实现的。
返回 读入的字符。如果getc函数遇到输入流的末尾,那么它会设置stdin流的文件尾指示器并
且返回EOF。如果读取发生错误,那么getc函数设置stdin流的错误指示器并且返回EOF。
相似函数 fgetc函数、getc函数
相关函数 putchar函数、ungetc函数
也可参见 fputc函数、putc函数 7.3节、22.4节
getenv 获取外部环境字符串
char *getenv(const char *name);
为了检查是否有任意字符串匹配name指向的字符串,搜索操作系统的外部环境列表。
返回 与匹配名相关的字符串的指针。如果没有找到匹配则返回空指针。
也可参见 system函数 26.2节
gets 读入字符串
char *gets(char *s);
从stdin流中读入多个字符,并且把这些读入的字符存储到s指向的数组中。
612
613
426 附录 D 标准库函数
返回 s(即存储输入的数组的指针)。如果读取发生错误或gets函数在存储任何字符之前遇到流
的末尾,那么返回空指针。
相似函数 fgets函数
相关函数 puts函数
也可参见 fputs函数 13.3节、22.5节
gmtime 转换成格林威治标准时间
struct tm *gmtime(const time_t *timer);
返回 指向结构的指针,此结构包含的分解的UTC(协调世界时间—从前的格林威治时间)值等
价于timer指向的日历时间。如果UTC无效,则返回空指针。
相似函数 localtime函数
相关函数 asctime函数、ctime函数、difftime函数、mktime函数、strftime函数、time函
数 26.3节
isalnum 测试是字母或数字
int isalnum(int c);
返回 如果isalnum是字母或数字,返回非零值;否则返回零。(如果isalph(c)或isdigit(c)
为真,则c是字母或数字。)
相关函数 isalpha函数、isdigit函数
也可参见 islower函数、isupper函数 23.4节
isalpha 测试字母
int isalpha(int c);
返回 如果isalnum是字母,返回非零值;否则返回零。(如果islower(c)或isupper(c)
为真,则c是字母。)
相似函数 islower函数、isupper函数
相关函数 isalnum函数
也可参见 tolower函数、toupper函数 23.4节
iscntrl 测试控制字符
int iscntrl(int c);
返回 如果c是控制字符,返回非零值;否则返回零。
相关函数 isgraph函数、isprint函数、isspace函数 23.4节
isdigit 测试数字
int isdigit(int c);
返回 如果c是数字,返回非零值;否则返回零。
相似函数 isxdigit函数
相关函数 isalnum函数 23.4节
isgraph 测试图形字符
int isgraph(int c);
返回 如果c是显示字符(除了空格),返回非零值;否则返回零。
相似函数 isprint函数
相关函数 iscntrl函数、isspace函数 23.4节
islower 测试小写字母
int islower(int c);
返回 如果c是小写字母,返回非零值;否则返回零。
相似函数 isalpha函数、isupper函数
相关函数 tolower函数、toupper函数
也可参见 isalnum函数 23.4节
isprint 测试显示字符
614
附录 D 标准库函数 427
int isprint(int c);
返回 如果c是显示字符(包括空格),返回非零值;否则返回零。
相似函数 isgraph函数
相关函数 iscntrl函数、isspace函数 23.4节
ispunct 测试标点字符
int ispunct(int c);
返回 如果c是标点符号字符,返回非零值;否则返回零。除了空格、字母和数字字符以外,
所有显示字符都可以看成是标点符号。
也可参见 isalnum函数、isgraph函数、isprint函数 23.4节
isspace 测试空白字符
int isspace(int c);
返回 如果c是空白字符,返回非零值;否则返回零。空白字符有空格(' ')、换页符('\f')、
换行符('\n')、回车符('\r'),横向制表符('\t')和纵向制表符('\v')。
也可参见 iscntrl函数、isgraph函数、isprint函数 23.4节
isupper 测试大写字母
int isupper(int c);
返回 如果c是大写字母,返回非零值;否则返回零。
相似函数 isalpha函数、islower函数
也可参见 tolower函数、toupper函数 23.4节
isxdigit 测试十六进制数字
int isxdigit(int c);
返回 如果c是十六进制数字(0-9、a-f、A-F),返回非零值;否则返回零。
相似函数 isdigit函数 23.4节
labs 长整数的绝对值
longint labs(long int j);
返回 j的绝对值。如果不能表示j的绝对值,那么函数的行为是未定义的。
相似函数 abs函数、fabs函数 26.2节
ldexp 联合小数和指数
double ldexp(double x, int exp);
返回 x × 2exp的值。可能会发生取值范围错误。
相关函数 frexp函数 23.3节
ldiv 长整数除法
ldiv_t ldiv(long int numer, long int denom);
返回 含有quot(numer除以denom的商)和rem(余数)的结构。如果无法表示结果,那么
函数的行为是未定义的。
相似函数 div函数 26.2节
localeconv 获取区域转换
struct lcon