版权说明:
本资料内容摘录自《C程序设计语言(第二版)》K&R著 徐宝文 李志译 尤晋元审校
机械工业出版社出版 一书。版权属原作者和出版社所有。制作本资料为了我本人学习和参考,非商业用途。
建议读者阅读原书学习比较好,它更详细。
目录:
附录B:标准库
介绍标准库的组成,及使用注意。
B.1 输入与输出:<stdio.h>
主要介绍流的概念等。
B.1.1 文件操作
主要介绍 fopen(), freopen(), fflush(), fclose(), remove(), rename(), tmpfile(), tmpnam(), setvbuf(),setbuf()等。
B.1.2 格式化输出
主要介绍 printf(), fprintf(), sprintf(), vprintf(), vfprintf(), vsprintf()等。
B.1.3 格式化输入
主要介绍 fscanf(), scanf(), sscanf()等。
B.1.4 字符输入/输出函数
主要介绍 fgetc(), fgets(), fputc(), fputs(), getc(), gets(), putc(),puts(), putchar(), ungetc()等。
B.1.5 直接输入输出
主要介绍 fread()和fwrite()。
B.1.6 文件定位函数
主要介绍 fseek(), ftell(), rewind(), fgetpos(), fsetpos()等。
B.1.7 错误处理函数
主要介绍 clearerr(), feof(), ferror(), perror()等。
B.2 字符类别测试:<ctype.h>
主要介绍 isalnum(c), isalpha(c), iscntrl(c), isdigit(c), … , tolower(c), toupper(c)等。
B.3 字符串函数:<string.h>
主要介绍 strcpy(),strncpy(), strcat(), strncat(), strcmp(), strncmp(), strchar(), strrchr(), strspn(), strcspn(), strpbrk(), strstr(), strlen(), strerror(), strtok()等。
B.4 数学函数:<math.h>
主要介绍 sin(), cos(), tan(), asin(), acos(), atan(), atan2(), sinh(), cosh(), tanh(), exp()
log(), log10(), pow(), sqrt(), ceil(), floor(), fabs(), ldexp(), frexp(), modf(), fmod()等。
B.5 实用函数:<stdlib.h>
主要介绍 atof(), atoi(), atol(), strtod(), strtoul(), rand(), srand(), calloc(), malloc(), realloc(), free(), abort(), exit(), atexit(), system(), getenv(), bsearch(), qsort(), abs(), labs(), div(), ldiv()等。
B.6 诊断:<assert.h>
主要介绍 assert()。
B.7 可变参数表:<stdarg.h>
主要介绍 va_list, va_start, va_end。
B.8 非局部跳转:<setjmp.h>
主要介绍 setjmp(), longjmp()等。
B.9 信号:<signal.h>
主要介绍 signal(), raise()等。
B.10 日期与时间函数:<time.h>
主要介绍 clock(), time(), difftime(), mktime(), asctime(), ctime(), strftime()等。
B.11 与具体实现相关的限制:<limits.h>和<folat.h>
主要介绍整型大小的常量,浮点运算的一些常量。
附录B:标准库 返回目录
本附录总结了ANSI标准定义的函数库。标准库不是C语言本身的构成部分,但是支持标准C的实现会提供该函数库中的函数声明、类型及宏定义。在这部分内容中,我们省略了一些使用比较受限的函数以及一些可以通过其他函数简单合成的函数,也省略了多字节字符的内容,同时,也不准备讨论与区域相关的一些属性,也就是与本地语言、国籍或文化相关的属性。
标准库中的函数、类型以及宏分别在下面的标准头文件中定义:
<assert.h> <float.h> <math.h> <stdarg.h> <stdlib.h>
<ctype.h> <limits.h> <setjmp.h> <stddef.h> <string.h>
<errno.h> <local.h> <signal.h> <stdio.h> <time.h>
可以通过下列方式访问头文件:
#include <;头文件>
头文件的包含顺序是任意的,并可包含任意多次。头文件必须被包含在任何外部声明或定义之外,并且,必须在使用头文件中的任何声明之前包含头文件。头文件不一定是一个源文件。
以下划线开头的外部标识符保留给标准库使用,同时,其他所有以一个下划线和一个大写字母开头的标识符以及两个下划线开头的标识符也都保留给标准库使用。
B.1 输入输出:<stdio.h> 返回目录
头文件<stdio.h>中定义的输入和输出函数、类型以及宏的数目几乎占整个标准库的三分之一。
流(stream)是与磁盘或其他外围设备关联的数据的源或目的地。尽管在某些系统中(如著名的UNIX系统中),文本流和二进制流是相同的,但标准库仍然提供了这两种类型的流。文本流是由文本行组成的序列,每行包含0个或多个字符,并以‘\n’结尾。在某些环境中,可能需要将文本流转换为其他表示形式(例如把‘\n’映射成回车符和换行符),或从其他表示形式转换为文本流。二进制流是由未经处理的字节构成的序列,这些字节记录着内部数据,并具有下列性质:如果在同一系统中写入二进制流,然后再读取该二进制流,则读出和写入的内容完全相同。
打开一个流,将把流与一个文件或设备连接起来,关闭流将断开这种连接。打开一个文件将返回一个
指向FILE 类型对象的指针,该指针记录了控制该流的所有必要信息。在不引起歧义的情况下,我们在下文中将不再区分“文件指针”和“流”。
程序开始执行是,stdin、stdout和stderr这3个流已经处于打开状态。
B.1.1 文件操作 返回目录
下列函数用于处理与文件有关的操作。其中,类型size_t是由运算符sizeof生成的无符号整形。
FILE *fopen(const char *filename, const char *mode)
fopen函数打开filename指定的文件,并返回一个与之相关联的流。如果打开失败,则返回NULL。
访问模式mode可以为下列合法值之一:
“r”打开文本文件用于读
“w”创建文本文件用于写,并删除已存在的内容(如果有的话)
“a”追加;打开或创建文本文件,并向文件末尾追加内容
“r+”打开文本文件用于更新(即读和写)
“w+”创建文本文件用于更新,并删除已存在的内容(如果有的话)
“a+”追加;打开或创建文本文件用于更新,写文件时追加到文件末尾
后三种方式(更新方式)允许对同一个文件进行读和写。在读和写的交叉过程中,必须调用fflush函数或文件定位函数。如果在上述访问模式之后再加上b,如“rb”或“w+b”等,则表示对二进制文件进行操作。文件名filname限定最多为FILENAME_MAX个字符。一次最多可打开FOPEN_MAX个文件。
FILE *freopen(const char *filename, const char *mode, FILE *stream)
freopen函数以mode指定的模式打开filename指定的文件,并将该文件关联到stream指定的流。它返回stream;若出错则返回NULL。freopen函数一般用于改变与stdin、stdout和stderr相关联的文件。
int fflush(FILE *stream)
对输出流来说,fflush函数将已写到缓冲区但尚未写入文件的所有数据写到文件中。对输入流来说,其结果是未定义的。如果在写的过程中发生错误,则返回EOF,否则返回0。fflush(NULL)将清洗所有的输出流。
int fclose(FILE *stream)
fclose函数将所有未写入的数据写入stream中,丢弃缓冲区中的所有未读输入数据,并释放自动分配的全部缓冲区,最后关闭流。若出错则返回EOF,否则返回0。
int remove(const char *filename) 返回目录
remove函数删除filename指定的文件,这样,后续试图打开该文件的操作将失败。如果删除操作失败,则返回一个非0值。
int rename(const char *oldname, const char *newname)
rename函数修改文件的名字。如果操作失败,则返回一个非0值。
FILE *tmpfile(void)
tmpfile函数以模式“w+b”创建一个临时文件,该文件在被关闭或程序正常结束时将被自动删除。如果创建操作成功,该函数返回一个流;如果创建文件失败,则返回NULL。
char *tmpnam(char s[L_tmpnam]) 返回目录
tmpnam(NULL)函数创建一个与现有文件名不同的字符串,并返回一个指向一内部静态数组的指针。t
mpname(s)函数把创建的字符串保存到数组s中,并将它作为函数值返回。s中至少要有L_tmpnam个字符的空间。tmpnam函数在每次被调用时均生成不同的名字。在程序执行的过程中,最多只能确保生成TMP_MAX个不同的名字。注意,tmpnam函数只能用于创建一个名字,而不能创建一个文件。
int setvbuf(FILE *stream, char *buf, int mode, size_t size)
setvbuf函数控制流stream的缓冲。在执行读、写以及其他任何操作之前必须调用此函数。当mode的值为
_IOFBF时,将进行完全缓冲。当mode的值为_IOLBF时,将对文本文件进行行缓冲,当mode的值为_IONBF时,表示不设置缓冲。如果buf的值不是NULL,则setvbuf函数将buf指向的区域作为流的缓冲区,否则将分配一个缓冲区。size决定缓冲区的长度。如果setvbuf函数出错,则返回一个非0值。
void setbuf(FILE *stream, char *buf)
如果buf的值为NULL,则关闭流stream的缓冲;否则setbuf函数等价于(void)setvbuf(stream, buf,
_IOFBF, BUFSIZ)。
B.1.2 格式化输出 返回目录
printf函数提供格式化输出转换。
int fprintf(FILE *stream, const char *format, …)
fprintf函数按照format说明的格式对输出进行转换,并写到stream流中。返回值是实际写入的字符数。若出错则返回一个负值。
格式串由两种类型的对象组成:普通字符(将被复制到输出流中)与转换说明(分别决定下一后续参数的转换和打印)。每个转换说明均以字符%开头,以转换字符结束。在%与转换字符之间可以依次包含下列内容:
◆标志(可以以任意顺序出现),用于修改转换说明
- 指定被转换的参数在其字段内左对齐
+ 指定在输出的数前面加上正负号
空格 如果第一个字符不是正负号,则在其前面加上空格isalpha 函数
0 对于数值转换,当输出长度小于字段宽度时,添加前导0进行填充
# 指定另一种输出形式。如果为O转换,则第一个数字为零;如果为x或X转换,指定在输出的非0值前加0x或0X;对于e、E、f、g或G转换,指定输出总包括一个小数点;对于g或G转换,值
尾部无意义的0将被保留
◆一个数值,用于指定最小字段宽度。转换后的参数输出宽度至少要达到这个数值。如果参数的字符数小于此
数值,则在参数左边(如果要求左对齐的话则为右边)填充一些字符。填充字符通常为空格,但是,如果设置了0填充标志,则填充字符为0。
◆点号,用于分隔字段宽度的精度。
◆表示精度的数。对于字符串,它指定打印的字符的最大个数;对于e、E或f转换,它指定打印的小数点后的数字位数;对于g或G转换,它指定打印的有效数字位数;对于整型数,它指定打印的数字位数(必要时可加填充为0以达到要求的精度)。
◆长度修饰符h、l或L。“h”表示将相应的参数按short或unsigned short类型输出。“l”表示将相应的参数按long或unsigned long类型输出;“L”表示将相应的参数按照long double类型输出。
宽度和精度中的一个或两个都可以用*指定,这种情况下,该值将通过转化下一个参数计算得到(下一个参数必须为int类型)。
表B-1中列出了这些转换字符及其意义。如果%后面的字符不是转换字符,则其行为没有定义。
表B-1 printf函数的转换字符
转换字符 参数类型;转换结果
d,i int;有符号十进制表示
o unsigned int;无符号八进制表示(无前导0)
x, X unsigned int;无符号十六进制表示(无前导0x和0X)。如果是0x,则使用abcdef,如果是0X,则使用ABCDEF
u int;无符号十进制表示
c int;转换为unsigne
d char类型后为一个字符
s char *;打印字符串中的字符,直到遇到‘\0’或者已打印了由精度指定的字符数
f double;形式为[-]mmm.ddd的十进制表示,其中,d的数目由精度确定,默认精度为6。精度为0
时,不输出小数点
e,E double;形式为[-]m.dddddd e±xx或[-]m.dddddd E±xx的十进制表示。d的数目由精度确定,默认精度为6。精度为0时不输出小数点
g,G double;当指数小于-4或大于等于精度是,采用%e或%E的格式,否则采用%f的格式。尾部的0与小数点不打印
p void *;打印指针值(具体表示方法与实现有关)
n int *;到目前为止,此printf调用输出的字符的数目将被写入到相应参数中。不进行参数转换% 不进行参数转换;打印一个符号%
int printf(const char *format, …) 返回目录
printf(…)函数等价于fprintf(stdout, …)。
int sprintf(char *s, const char *format, …)
sprintf函数与printf函数基本相同,但其输出将被写到字符串s中,并以‘\0’结束。s必须足够大,以足够容纳输出结果。该函数返回实际输出的字符数,不包括‘\0’。
int vprintf(const char *format, va_list arg)
int vfprintf(FILE *stream, const char *format, va_list arg)
int vsprintf(char *s, const char *format, va_list arg)
vprintf、vfprintf、vsprintf这三个函数分别于对应的printf函数等价,但它们用arg代替了可变参数表。arg有宏va_start初始化,也可能由va_arg调用初始化。详细的信息参见B.7节中对<stdarg.h>头文件的讨论。
B.1.3 格式化输入 返回目录
scanf函数处理格式化输入转换。
int fscanf(FILE *stream, const char *format, …)
fscanf函数根据格式串format从流stream中读取输入,并把转换后的值赋给后续各个参数,其中的每个参数都必须是一个指针。当格式串format用完时,函数返回。如果到达文件的末尾或在转换输入前出错,该函数返回EOF;否则,返回实际被转换并赋值的输入项的数目。
格式串format通常包括转换说明,它用于指导对输入进行解释。格式字符串中可以包含下列项目:
◆空格或制表符
◆普通字符(% 除外),它将与输入流中下一个非空白字符进行匹配
◆转换说明,由一个%、一个赋值屏蔽字符*(可选)、一个指定最大字段宽度的数(可选)、一个指定目标字段宽度的字符(h、l或L)(可选)以及一个转换字符组成。
转换说明决定了下一个输入字段的转换方式。通常结果将被保存在由对应参数指向的变量中。但是,如果转换说明中包含赋值屏蔽字符*,例如%*s,这将跳过对应的输入字段,并不进行赋值。输入字段是一个由非空白字符组成的字符串,当遇到下一个空白字符或达到最大字段宽度(如果有的话)时,对当前输入字段的读取结束。这意味着,scanf函数可以跨越行的边界读取输入,因为换行符也是空白符(空白符包括空格、横向制表符、纵向制表符、换行符、回车符和换页符)。
换行字符说明了对输入字段的解释方式。对应的参数必须是指针。合法的转换字符如表B-2所示。
如果参数是指向short类型而非int类型的指针,则在转换字符d、i、n、o、u和x之前可以加上前缀h。如果参数是指向long类型的指针,则在这几个转换字符前可以加上字母l。如果参数是指向double类型而非float 类型的指针,则在转换字符e、f和g前可以加上字母l。如果参数是指向long double类型的指针,则在转换字符e、f和g前可以加上字母L。
表B-2 scanf函数的转换字符
转换字符 输入数据;参数类型
d十进制整型数;int *
i整型数;int *。该整型数可以是八进制数(以0打头)或十六进制数(以0x或0X打头)
o八进制整型数(可以带或不带前导0);int *
u无符号十进制整型数;unsigned int *
x 十六进制整型数(可以带或不带前导0x或0X):int *
c 字符;char *,按照字段宽度的大小把读取的字符保存到指定的数组中,不增加字符‘\0’字段宽
度的默认值为1。在这种情况下,读取输入时将不跳过空白符,如果要读取下一个非空白字符,可
以使用%ls
s 由空白符组成的字符串(不包含引号);char *。它指向一个字符数组,该字符数组必须有足够的空间,以保存该字符串以及在尾部添加的‘\0’字符
e、f、g 浮点数;float *。float类型浮点数的输入格式为:一个可选的正负号、一个可能包含小数点的数
字串、一个可选的指数字段(字母e或E后跟一个可能带正负号的整型数)
p printf(“%p”)函数调用打印的指针值:void *
n 将到目前为止该函数调用读取的字符数写入对应的参数中;int *。不读取输入字符。不增加已转换的项目计数
[…] 与方括号中的字符集合匹配的输入字符中最长的非空字符串;char *。末尾将添加字符‘\0’。 [^…] 与方括号中的字符集合不匹配的输入字符中最长的非空字符串;char *。末尾将添加字符‘\0’。 % 表示“%”,不进行赋值
int scanf(const char *format, …) 返回目录
scanf(…)函数与fscanf(stdin, …)相同。
int sscanf(const char *s, const char *format, …)
sscanf(s, …)函数与scanf(…)等价,所不同的是,前者的输入字符来源于字符串s。
B.1.4 字符输入/输出函数 返回目录
int fgetc(FILE *stream)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论