C语言函数库详解收藏版.docx
《C语言函数库详解收藏版.docx》由会员分享,可在线阅读,更多相关《C语言函数库详解收藏版.docx(195页珍藏版)》请在冰豆网上搜索。
C语言函数库详解收藏版
c语言函数库
第一章(C标准库)
1.:
诊断
2.:
字符类别测试
3.:
错误处理
4.:
整型常量
5.:
地域环境
6.:
数学函数
7.:
非局部跳转
8.:
信号
9.:
可变参数表
10.:
公共定义
11.:
输入输出
12.:
实用函数
13.:
日期与时间函数
1.:
诊断
中只定义了一个带参的宏assert,其定义形式如下:
voidassert(int表达式)
assert宏用于为程序增加诊断功能,它可以测试一个条件并可能使程序终止。
在执行语句:
assert(表达式);
时,如果表达式为0,则在终端显示一条信息:
Assertionfailed:
0,file源文件名,line行号
Abnormalprogramtermination
然后调用abort终止程序的执行。
在中,带参宏assert是被定义为条件编译的,如果在源文件中定义了宏NDEBUG,则即使包含了头文件,assert宏也将被忽略。
2.:
字符类别测试
在头文件中定义了一些测试字符的函数。
在这些函数中,每个函数的参数都是整型int,而每个参数的值或者为EOF,或者为char类型的字符。
中定义的标准函数列表如下:
中定义的函数
函数定义,函数功能简介
intisalnum(intc),检查字符是否是字母或数字
intisalpha(intc),检查字符是否是字母
intisascii(intc),检查字符是否是ASCII码
intiscntrl(intc),检查字符是否是控制字符
intisdigit(intc),检查字符是否是数字字符
intisgraph(intc),检查字符是否是可打印字符
intislower(intc),检查字符是否是小写字母
intisprint(intc),检查字符是否是可打印字符
intispunct(intc),检查字符是否是标点字符
intisspace(intc),检查字符是否是空格符
intisupper(intc),检查字符是否是大写字母
intisxdigit(intc),检查字符是否是十六进制数字字符
inttoupper(intc),将小写字母转换为大写字母
inttolower(intc),将大写字母转换为小写字母
,
有关中定义的这些标准函数以及一些常用的非标准字符处理函数将在第十一章中进行详细地介绍。
3.:
错误处理
中定义了两个常量,一个变量。
1、EDOM
它表示数学领域错误的错误代码。
2、ERANGE
它表示结果超出范围的错误代码。
3、errno
这是一个变量,该值被设置成用来指出系统调用的错误类型。
4.:
整型常量
在头文件中定义了一些表示整型大小的常量。
下面给出这些常量的字符表示以及含义,见下表。
中定义的字符常量字符常量,取值,含义
CHAR_BIT,8,char类型的位数
CHAR_MAX,255或127,char类型最大值
CHAR_MIN,0或-127,char类型最小值
INT_MIN,-32767,int类型最小值
INT_MAX,32767,int类型最大值
LONG_MAX,2147483647,long类型最大值
LONG_MIN,-2147483647,long类型最小值
SCHAR_MAX,127,signedchar类型最大值
SCHAR_MIN,-127,signedchar类型最小值
SHRT_MAX,32767,short类型的最大值
SHRT_MIN,-32767,short类型的最小值
UCHAR_MAX,255,unsignedchar类型最大值
UINT_MAX,65535,unsignedint类型最大值
ULONG_MAX,4294967295,unsignedlong类型最大值
USHRT_MAX,65535,unsignedshort类型的最大值
5.:
地域环境
在中,定义了7个常量,一个结构,2个函数。
1、常量的定义
LC_ALL:
传递给setlocale的第一个参数,指定要更改该locale的哪个方面。
LC_COLLATE:
strcoll和strxfrm的行为。
LC_CTYPE:
字符处理函数。
LC_MONETARY:
localeconv返回的货币信息。
LC_NUMERIC:
localeconv返回的小数点和货币信息。
LC_TIME:
strftime的行为。
以上扩展成具有唯一取值的整型常数表达式,可作为setlocale的第一个参数。
NULL:
由实现环境定义的空指针。
2、structlconv结构
该结构用于存储和表示当前locale的设置。
其结构定义如下:
structlconv
{
char*decimal_point;
char*thousands_sep;
char*grouping;
char*int_curr_symbol;
char*currency_symbol;
char*mon_decimal_point;
char*mon_thousands_sep;
char*mon_grouping;
char*positive_sign;
char*negative_sign;
charint_frac_digits;
charfrac_digits;
charp_cs_precedes;
charp_sep_by_space;
charn_cs_precedes;
charn_sep_by_space;
charp_sign_posn;
charn_sign_posn;
};
3、函数
structIconv*localeconv(void);
函数localeconv将一个structIconv类型的对象的数据成员设置成为按照当前地域环境的有关规则进行数量格式化后的相应值。
char*setlocale(intcategory,char*locale);
函数setlocale用于更改和查询程序的整个当前地域环境或部分设置。
地域环境变量由参数category(上面定义的6个常量)和locale指定。
6.:
数学函数
在中定义了一些数学函数和宏,用来实现不同种类的数学运算。
下面给出中标准数学函数的函数定义及功能简介,见下表。
中定义的函数
函数定义,函数功能简介
doubleexp(doublex);,指数运算函数,求e的x次幂函数
doublelog(doublex),对数函数ln(x)
doublelog10(doublex);,对数函数log
doublepow(doublex,doubley);,指数函数(x的y次方)
doublesqrt(doublex);,计算平方根函数
doubleceil(doublex);,向上舍入函数
doublefloor(doublex);,向下舍入函数
doublefabs(doublex);,求浮点数的绝对值
doubleldexp(doublex,intn);,装载浮点数函数
doublefrexp(doublex,int*exp);,分解浮点数函数
doublemodf(doublex,double*ip);,分解双精度数函数
doublefmod(doublex,doubley);,求模函数
doublesin(doublex);,计算x的正弦值函数
doublecos(doublex);,计算x的余弦值函数
doubletan(doublex);,计算x的正切值函数
doubleasin(doublex);,计算x的反正弦函数
doubleacos(doublex);,计算x的反余弦函数
doubleatan(doublex);,反正切函数1
doubleatan2(doubley,doublex);,反正切函数2
doublesinh(doublex);,计算x的双曲正弦值
doublecosh(doublex);,计算x的双曲余弦值
doubletanh(doublex);,计算x的双曲正切值
在标准库中,还有一些与数学计算有关的函数定义在其他头文件中。
7.:
非局部跳转
在头文件中定义了一种特别的函数调用和函数返回顺序的方式。
这种方式不同于以往的函数调用和返回顺序,它允许程序流程立即从一个深层嵌套的函数中返回。
中定义了两个宏:
intsetjmp(jmp_bufenv);/*设置调转点*/
和
longjmp(jmp_bufjmpb,intretval);/*跳转*/
宏setjmp的功能是将当前程序的状态保存在结构env,为调用宏longjmp设置一个跳转点。
setjmp将当前信息保存在env中供longjmp使用。
其中env是jmp_buf结构类型的,该结构定义为:
typedefstruct{
unsignedj_sp;
unsignedj_ss;
unsignedj_flag;
unsignedj_cs;
unsignedj_ip;
unsignedj_bp;
unsignedj_di;
unsignedj_es;
unsignedj_si;
unsignedj_ds;
}jmp_buf[1];
直接调用setjmp时,返回值为0,这一般用于初始化(设置跳转点时)。
以后再调用longjmp宏时用env变量进行跳转。
程序会自动跳转到setjmp宏的返回语句处,此时setjmp的返回值为非0,由longjmp的第二个参数指定。
下面通过例子来理解中定义的这两个宏。
例程9-1非局部跳转演示。
#include
jmp_bufenv;/*定义jmp_buf类型变量*/
intmain(void)
{
intvalue;
value=setjmp(env);/*调用setjmp,为longjmp设置跳转点*/
if(value!
=0)
{
printf("Longjmpwithvalue%d\n",value);
exit(value);/*退出程序*/
}
printf("Jump...\n");
longjmp(env,1);/*跳转到setjmp语句处*/
return0;
}
本例程先应用setjmp宏为longjmp设置跳转点,当第一次调用setjmp时返回值为0,并将程序的当前状态(寄存器的相关状态)保存在结构变量env中。
当程序执行到longjmp时,系统会根据setjmp保存下来的状态env跳转到setjmp语句处,并根据longjmp的第二个参数设置此时setjmp的返回值。
本例程的运行结果为:
Jump...
Longjmpwithvalue1
一般地,宏setjmp和longjmp是成对使用的,这样程序流程可以从一个深层嵌套的函数中返回。
8.:
信号
头文件中提供了一些处理程序运行期间引发的各种异常条件的功能,例如一些来自外部的中断信号等。
在中只定义了两个函数:
intsignal(intsig,sigfunfname);
和
intraise(intsig);
signal函数的作用是设置某一信号的对应动作。
其中参数sig用来指定哪一个信号被设置处理函数。
在标准C中支持的信号如下表。
标准C支持的信号
取值,说明,默认执行动作,使用的操作系统
SIGABRT,异常中止,中止程序,UNIXDOS
SIGPPE,算术运算错误,中止程序,UNIXDOS
SIGILL,非法硬件指令,中止程序,UNIXDOS
SIGINT,终端中断,中止程序,UNIXDOS
SIGSEGV,无效的内存访问,中止程序,UNIXDOS
SIGTERM,中止信号,中止程序,UNIXDOS
参数fname是一个指向函数的指针,当sig的信号发生时程序会自动中断转而执行fname指向的函数。
执行完毕再返回断点继续执行程序。
系统提供了两个常量函数指针,可以作为函数的参数传递。
它们分别是:
SIG_DEF:
执行默认的系统第一的函数。
SIG_IGN:
忽略此信号。
raise函数的作用是向正在执行的程序发送一个信号,从而使得当前进程产生一个中断而转向信号处理函数signal执行。
其中参数sig为信号名称,它的取值范围同函数signal中的参数sig取值范围相同,见表9-6。
下面通过例子理解函数signal和raise。
例程9-2signall和raise函数演示
#include
#include
voidPrint1();
voidPrint2();
intmain()
{signal(SIGINT,Print1);
printf("PleaseenterCtr+cforinterupt\n");
getchar();
signal(SIGSEGV,Print2);
printf("Pleaseenteranykeyforainterupt\n");
getchar();
raise(SIGSEGV);
}
voidPrint1()
{
printf("ThisisaSIGINTinterupt!
\n");
}
voidPrint2()
{
printf("ThisisaSIGSEGVinterupt!
\n");
}
本例程首先通过用户终端输入Ctrl+c产生一个终端中断,然后应用signal函数调用中断处理函数Print1;再通过raise函数生成一个无效内存访问中断,并通过signal函数调用中断处理函数Print2。
本例程的运行结果为:
PleaseenterCtr+cforinterupt
^C
ThisisaSIGINTinterupt!
Pleaseenteranykeyforainterupt
a
ThisisaSIGSEGVinterupt!
9.:
可变参数表
可变参数表中的宏是用来定义参数可变的函数的。
在C语言中,有些库函数或者用户自定义的函数的参数是可变的,常用省略号“……”(例如库函数中的printf),定义这样的函数就要使用到中的宏。
1、va_list
用于保存宏va_start,va_arg以及va_end所需信息的数据类型。
2、中还定义了三个宏
voidva_start(va_listap,parmN);
typeva_arg(va_listap,type);
voidva_end(va_listap);
va_start的作用是初始化ap,因此va_start要在所有其它的va_开头的宏前面最先使用(除了用va_list定义变量外),后面的va_copy,va_arg,va_end都要使用到ap。
在一对va_start和va_end之间不能再次使用va_start宏。
其中,parmN为"..."之前的最后一个参数。
例如,printf函数定义为:
printf(constchar*format,...);那么在printf函数中的va_start使用之后,parmN的值就等于*format。
va_arg的作用就是返回参数列表ap中的下一个具有type类型的参数,每次调用va_arg都会修改ap的值,这样才能连续不断地获取下一个type类型的参数。
va_end与va_start构成了一个scope,va_end标志着结束,va_end之后ap就无效了。
10.:
公共定义
在头文件中,指定了标准库中的公共定义。
其中主要包括以下内容:
1、NULL
空指针类型常量。
2、offset(type,member-designator)
它是扩展iz-t类型的一个整型常数表达式。
它的值为从type定义的结构类型的开头到结构成员member-designator的偏移字节数。
3、ptrdiff_t
表示两指针之差的带符号整数类型。
4、size_t
表示由sizeof运算符计算出的结果类型,它是一个无符号整数类型。
5、wchar_t
它是一种整数类型,取值范围为在被支持的地域环境中最大扩展字符集的所有字符的各种代码,空字符代码值为0。
11.:
输入输出
在头文件中定义了输入输出函数,类型和宏。
这些函数、类型和宏几乎占到标准库的三分之一。
下面给出头文件中声明的函数以及功能简介,见下表。
中声明的函数
函数定义,函数功能简介
FILE*fopen(char*filename,char*type),打开一个文件
FILE*fropen(char*filename,char*type,FILE*fp),打开一个文件,并将该文件关联到fp指定的流
intfflush(FILE*stream),清除一个流
intfclose(FILE*stream),关闭一个文件
intremove(char*filename),删除一个文件
intrename(char*oldname,char*newname),重命名文件
FILE*tmpfile(void),以二进制方式打开暂存文件
char*tmpnam(char*sptr),创建一个唯一的文件名
intsetvbuf(FILE*stream,char*buf,inttype,unsignedsize),把缓冲区与流相关
intprintf(char*format...),产生格式化输出的函数
intfprintf(FILE*stream,char*format[,argument,...]),传送格式化输出到一个流中
intscanf(char*format[,argument,...]),执行格式化输入
intfscanf(FILE*stream,char*format[,argument...]),从一个流中执行格式化输入
intfgetc(FILE*stream),从流中读取字符
char*fgets(char*string,intn,FILE*stream),从流中读取一字符串
intfputc(intch,FILE*stream),送一个字符到一个流中
intfputs(char*string,FILE*stream),送一个字符到一个流中
intgetc(FILE*stream),从流中取字符
intgetchar(void),从stdin流中读字符
char*gets(char*string),从流中取一字符串
intputchar(intch),在stdout上输出字符
intputs(char*string),送一字符串到流中
intungetc(charc,FILE*stream),把一个字符退回到输入流中
intfread(void*ptr,intsize,intnitems,FILE*stream),从一个流中读数据
intfwrite(void*ptr,intsize,intnitems,FILE*stream),写内容到流中
intfseek(FILE*stream,longoffset,intfromwhere),重定位流上的文件指针
longftell(FILE*stream),返回当前文件指针
intrewind(FILE*stream),将文件指针重新指向一个流的开头
intfgetpos(FILE*stream),取得当前文件的句柄
intfsetpos(FILE*stream,constfpos_t*pos),定位流上的文件指针
voidclearerr(FILE*stream),复位错误标志
intfeof(FILE*stream),检测流上的文件结束符
intferror(FILE*stream),检测流上的错误
voidperror(char*string),系统错误信息
在头文件中还定义了一些类型和宏。
12.:
实用函数
在头文件中声明了一些实现数值转换,内存分配等类似功能的函数。
下面给出头文件中声明的函数以及功能简介,见下表。
中声明的函数
函数定义,函数功能简介
doubleatof(constchar*s),将字符串s转换为double类型
intatoi(constchar*s),将字符串s转换为int类型
longatol(constchar*s),将字符串s转换为long类型
doublestrtod(constchar*s,char**endp),将字符串s前缀转换为double型