已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
上章回顾 数组和指针相同与不同通过指针访问数组和通过数组访问指针指针在什么时候可以加减运算函数指针的申明和调用函数数组和数组函数 C语言标准库 附录二 预习检查 NULL和NUL有什么差别字符串操作有哪几个常用函数memcpy和strcpy有什么差别 课程目标 本章概述对标准C语言的补充 以及一些常用的特性 本章目标了解一些C语言特殊的宏定义掌握函数可变参数的应用重点理解NULL offsetof errno宏或函数掌握函数可变参数列表难点C语言库的日期函数操作难点函数的可变参数列表标准C的异常处理机制 本章结构 标准语言库概述 C标准语言库概要和应用 主要库文件 标准C语言函数 标准库应用总结 2 1标准语言概述 函数库简介C语言标准库的历史标准库函数优势独立环境和宿主环境 2 1 1函数库简介 标准c语言包括语言标准和一组标准库支持字符和字符串 输入与输出 数学函数 期与时间转换 动态存储分配和其他特性预处理器命令 include 引用这个库的头文件例 下列程序段中头文件math h使程序能够访问余弦函数cos includedoublex y x cos y 2 1 1函数库简介 对定义为函数的库功能 标准C语言允许实现提供除真正函数以外的同名函数式宏例 假设担心math h中已有名为cos的宏 则可以用下面两种方法引用基础函数 两者都利用宏名后面不能紧跟一个开括号的特点 避免扩展同名函数或宏cos includedoublea b p double p cos a p b calIsfunctioncos always a cos b callsfunctioncos always 也可以取消所有涉及到的宏的定义 include undefcos a cos b callsfunctioncos always 2 1 2C语言标准库的历史 C语言提供的标准函数库 函数库通过 include进行引用在C89标准中 在95年的修正版中在C99中增加了六个函数库 2 1 3标准库函数优势 准确性高效性可移植性 2 1 4独立环境和宿主环境 独立 free standing 系统嵌入式系统可以不要任何类型的文件系统 也可以基本上不要操作系统不要求它们提供除语言本身以外的任何东西宿主 hosted 环境程序运行在RC机 大型机或者介于两者之间的计算机上 2 2标准C语言函数 标准C语言函数C 兼容性 2 2 1标准C语言函数 如何从标准c语言定义得到传统c语言库函数定义消除任何使用标准c语言类型的函数 如longlong与 Complex 或消除标准c语言中新增的函数 C89或C99 删除限定符const restrict与volatile删除数组声明符括号内使用的static 将类型void 换成char 将size t换成int 2 2 1标准C语言函数 库函数注意事项库名原则上是保留字 编程人员不能定义与标准库名称同名的外部对象 库头文件或文件名可以内置在实现中 但仍然要被包括之后才能访问其名称编程人员可以多次按任意顺序包括库头文件 例下面的方法可以保证库头文件不被包括多次 IHeaderBtddef H ifndef STDDEF Don ttrytoredeclare define STDDEFltypedefintptrdiff t 0therdefinitions endif 2 2 2C 兼容性 C 语言包括标准C语言运行库 但增加了几个C 特定库不能从c语言程序中调用c 函数 但c 提供了从C 中调用c语言函数的方法在C 中 声明c语言函数时有两个要求函数声明要使用标准c语言原型 因为c 要求原型 外部c语言要显式地标为具有c语言连接 即在c 的存储类extern后面加上字符串 C 2 2 2C 兼容性 c语言函数中调用另一C语言函数externintf void c 中调用C语言函数extern C intf void c 中要声明一组c语言函数 则可以对所有c语言函数采用连接规范 extern C doublesqrt doublex intf void 2 2 2C 兼容性 从C语言或c 调用头文件library h在头文件中包括extern C 声明 条件预编译 cplusplus宏 表示这是个c 程序 用正常c语言声明编写头文件 要求c 用户用 include命令包装连接声明 Filelibrary h ifdef cplusplusextern c endif Cdeclarations ifdef cplusplus endif extern C include library h 2 3主要的库文件 stddef hmath hctype herron hstdbool hiso645 hassert h stdio hstdlib hstring hstdarg htime hsetjmp hsignal h 2 3 1Stddef h 语法概要之定义 include defineNULL typedef ptrdiff t typedef size tjtypedef wchar t defineoffsetof type member designator 2 3 1Stddef h NULLnull指针常量0转换为类型void的0ptrdiff t实现定义的带符号整型是两个指针相减所得到的类型size tsizeof运算符得到的无符号整型offsetof扩展一个整型常量表达式 defineoffsetof type memb size t type 0 memb 2 3 1Stddef h 例 对于sizeof int 为4的字节寻址计算机程序运行结果是 diff的值为1size的值为4offset的值为4 includestructs inta intb x size tsize offset ptrdiff tdiff Diff x b x a Size sizeof x a offset offsetof structs b 2 3 2math h 双精度浮点数的精度进行操作参数传递和错误处理如果传递过来的参数不在其定义域内 函数会返回一些不确定的值 并将变量errno置为EDOM 如果返回值太大 无法用一个double类型表示 造成上溢 这些函数会返回HUGEVAL 并将errno置为ERANGE 如果函数结果太小 无法表示 则函数返回0 errno是否设置为ERANGE由实现确定EDOM ERANGE和HUGEVAL都在math h中定义 2 3 3ctype h 字符处理有两类函数 分类与转换分类函数的名称以is开头转换函数的名称以to开头宽字符进行运算的分类与转换函数分类函数 isw转换函数 tow 2 3 3ctype h 字符处理有两类函数 分类与转换分类函数的名称以is开头转换函数的名称以to开头宽字符进行运算的分类与转换函数分类函数 isw转换函数 tow通用函数分类函数wcstrans与iswctrans转换函数wctrans与towctrans 2 3 3ctype h 例 inelude defineTRUE1 defineFALSE0intis id constchar s charch if ch s 0 returnFALSE emptystring if isalpha ch ch returnFALSE while ch s 0 if isalnum ch ch returnFALSE returnTRUE 2 3 4erron h 语法概要 includeexterninterrno or defineerrno defineEDOM defineERANGE defineETLSEQ includevoidperror constchar s includechar strerror interrnum errno保存库程序中实现定义的错误码 通常被定义为errno h中以E开头的宏在标准c语言中 errno不能是变量 但可以扩展成int类型的任何可修改的lvalue的宏 errno用法例errno的常见用法是在调用库函数之前先清零 随后再进行检查 2 3 4erron h errno 0 x sqrt y if errno printf sqrtfalled code d n errno x 0 c语言实现通常定义一组标准错误码 EDOM参数不在数学函数能接受的域中 例如log函数的参数不能为负数参数ERANGE数学函数的结果超出范围EILSEQ翻译多字节字符序列时遇到的编码错误 这个错误最终会由mbrtowc或wcrtomb发现 它们又被其他宽字符函数调用 c89增补l 函数strerror返回一个错误消息字符串的指针 其内容是由实现定义的 字符串不能修 但可以在后续调用strerror函数时覆盖函数perror在标准错误输出流中打印下面的序列 参数字符串s 冒号 空格 包errno中当前错误码的错误短消息和新行符 2 3 4erron h perror使用例子 perror函数代替printf函数如果调用sqrt失败 则输出如下 sqrtfailed domainerror 2 3 4erron h include include errno 0 x sqrt y if errno perror sqrtfailed x 0 语法概要 2 3 5bool false true include definebool Bool 无符号整数类型 只能保存数值0和1 definefalse0 definetrue1 define bool true false are define1 语法概要如果调用sqrt失败 则输出如下 sqrtfailed domainerror 2 3 6iso646 h include defineand defineand eq definebitand definebitor definecompl definenot definenot eq defineor defineor eq definexor definexor eq 2 3 7assert h Assert h函数提供标准控制流扩展语法概要 include ifndefNDGBUGvoidassert intexpression else defineassert x void 0 endif作用标准输出流中打印一个诊断消息 参数文本 文件名 FILE 和号 LINE 调用abort函数或exit函数终止程序 2 3 7assert h 例 测试一个条件并可能使程序终止 include include includestructITEM intkey intvalue voidadditem structITEM itemptr assert itemptr NULL intmain void additem NULL return0 C常用字符串处理函数及使用示例char strncat char s1 constchar s2 size tn 将字符串s2中最多n个字符添加到字符串s1的后面 s2的第一个字符重定义s1的null终止符 返回s1的值intstrcmp constchar s1 constchar s2 比较字符串s1和字符串s2 函数在s1等于 小于或大于s2时分别返回0 小于0或大于0的值intstrncmp constchar s1 constchar s2 size tn 比较字符串s1中的n个字符和字符串s2 函数在s1等于 小于或大于s2时分别返回0 小于0或大于0的值 2 3 8string h C常用字符串处理函数及使用示例char strcpy char s1 constchar s2 将字符串s2复制到字符串数组s1中 返回s1的值char strncpy char s1 constchar s2 size tn 将字符串s2中最多n个字符复制到字符串数组s1中 返回s1的值char strcat char s1 constchar s2 将字符串s2添加到字符串s1的后面 s2的第一个字符重定义s1的null终止符 返回s1的值 2 3 8string h C常用内存处理函数void memccpy void destin void source charch unsignedn 若复制了ch 则返回直接跟随ch的在destin中的字节的一个指针Void memcpy void destin void source unsigned unsignedn 从source复制一个n字节的块到destin 如果源块和目标块重迭 则选择复制方向void memchr void s charch unsignedn 返回在s中首先出现ch的一个指针 如果在s数组中不出现ch 就返回NULL void memcmp void s1 void s2 unsignedn 比较正好是n字节长的两个字符串s1和s2 些函数按无符号字符比较字节 2 3 8string h C常用内存处理函数intmemicmp void s1 void s2 unsignedn 比较s1和s2的前n个字节 不管字符大写或小写 void memmove void destin void source unsignedn 从source复制字节到destinvoid memcpy void destin void source unsignedn 从source复制字节到destinvoid memset void s charch unsignedn 将s的所有字节置于字节ch中 s数组的长度由n给出 2 3 8string h Stdarg h头文件提供了访问可变参数表语法概要 2 3 9stdarg h includetypedef va list defineva start va listap typeLastFixedParm defineva arg va listap type voidva end va listap voidva copy va listdest va listsrc stdarg h中定义的宏 函数和类型的含义Va list这种类型声明局部状态变量 用于遍历参数 Va start这个宏初始化状态变量ap 要先调用之后才能调用 将ap中的内部指针设置成指向传入函数的第一个可变参数 Va arg这个宏返回参数表中下一个参数的值 将内部参数指针 在ap中 移到下一个参数 如有 Va end这个函数或宏在用va arg读取所有参数之后调用 Va copy C99 这个宏在dest中复制src的当前状态 在参数表中生成第二个指针 然后可以独立对src与dest采用va arg 2 3 9stdarg h 编写可变个数参数的函数 2 3 9stdarg h include printargs h intarg types INTARG DBLARG INTARG DBLARG 0 intmain printargs ar9 types 0 l 2 0 3 4 0 return0 printargs的声明和整数类型指定符的值放在文件printargs h中 fileprintargs h StandardC include defineINTARG1 codesusedinargtypep defineDBLARG2 voidprintargs int argtypep 2 3 9stdarg h 标准C语言中printargs的相应定义如下 include include printargs h voidprintargs int argtypep StandardC va listap intargtype va start ap argtypep while argtype argtypep 0 switch argtype caseTNTARG printf int d n va arg ap int break caseDBLARG printf double f n va arg ap double break while va end ap 2 3 10setjmp h 语法概要setjmp与longjmp函数实现非本地跳转处理异常例外情形 includetypedef jmp buf intsetjmp Jmp bufenv voidlongJmp jmp bufenv intstatus 2 3 10setjmp h jmp buf数组类型Setjmpenv是个由实现定义的数组返回0Longjmpenv是个由实现定义的数组返回status 2 3 10setjmp h 例 includeImp bufErrorEnv intguard void Return0ifsuccessfultelselongjmpcode intstatus setjmp ErrorEnv if status 0 returnstatus error process return0 intprocess void if error happened longjmp ErrorEnv error code 2 3 11signal h 语法概要 include defineSIG IGN defineSIG DFL defineSIG ERR defineSIGxxxx void signal intsig void func int int intraise intsig typedef sig atomic t Non Standardextensionst intkill intpid intsig int ssignal intsoftsig int func int int intgsignal intsoftsig voidpeignal intsig char prefix 2 3 11signal h 运用特点信号是 潜在的 异步事件信号的触发可以通过计算机的错误探测机制 用户程序中的kill或raise函数以及程序外部的操作用法 信号处理器是个用户函数voidmy handler intthe signal SIG IGN signal sig SIG IGN SIG DFL signal sig SIG DFL raise或gsignal函数在当前进程中发出指定的信号 或软件信号 kill函数使特定进程中发出指定的信号 2 3 11signal h 运用实例 voidnew handler intsig void old handler Setnewhandler savingoldhandler old handler signal sig storeoldhandler if signal sig old handler SIG ERR fprintf stderr Could tputbackoldhandler n 2 3 11signal h 信号处理注意事项如果信号是由raise或gsignal发出的 则这些函数返回其调用者 如果信号是由abort发出的 则标准c语言程序终止 其他实现可能返回abort的调用者 如果处理的信号是SIGFPE或另一实现定义的计算信号 则返回时的行为是未定义的 2 4标准库应用总结 编写参数数目可变的函数判断字符标准C的异常处理机制对内存进行操作的标准库函数C语言日期操作malloc calloc realloc NULL和NUL的区别非格式化输入输出函数 2 4 1编写参数数目可变的函数 利用stdarg h例 printf Hello world n nomorearguments printf s n Hello world onemorestringargument printf s s n Hello world twomorestringarguments printf s d n Hello 42 onestring oneint 2 4 2标准C的异常处理机制 绝对终止条件结束非局部goto信号 Signals 公共变量 2 4 2 1绝对终止 调用stdlib habort 粗鲁地结束程序exit 文明地结束程两者区别abort立即结束程序 不保存数据exit保存数据 执行客户用atexit注册的清除代码 include includestaticvoidatexit handler 1 void printf within atexit handler 1 n staticvoidatexit handler 2 void printf within atexit handler 2 n intmain void atexit atexit handler 1 atexit atexit handler 2 exit EXIT SUCCESS printf thislineshouldneverappear n return0 2 4 2 1绝对终止 例 结果within atexit handler 2 within atexit handler 1 并返回退出码给调用环境 2 4 2 2条件结束 中的assert defineassert condition assert condition condition FILE LINE printf函数调用abort终止程序自定义assert函数例 void assert inttest charconst test image charconst file intline if test printf Assertionfailed s file s line d n test image file line abort 2 4 2 3非局部goto 中的setjmp与longjmp特点可以goto到任何地方在程序的任意地方控制它操作特点jmp buf内容 程序位置指针 堆栈与框架指针 寄存器与内存值setjmp j 设置goto指针setjmp可以标记相应的异常处理过程longjmp来引发终止异常longjmp j r 来goto到对象j指定的地方 2 4 2 3非局部goto 操作实例 include includejmp bufj voidraise exception void printf exceptionraised n longjmp j 1 jump到异常处理过程 printf thislineshouldneverappear n intmain void if setjmp j 0 printf setjmp isinitializing j n raise exception 恢复上下文printf thislineshouldneverappear n else printf setjmp wasjustjumpedinto n 异常处理过程 return0 运行结果 setjmp isinitializing j exceptionraisedsetjmp wasjustjumpedinto 2 4 2 4信号 Signals 中的raise与signalraise来引发信号 并进入到相应的处理过程signal两种安装指定处理方法 signal SIGxxx SIG DFL 使用系统默认的处理方法 signal SIGxxx SIG IGN 告诉系统忽略信号 实例 voidhandler intsignal value voidf void signal SIGFPE handler 注册处理过程 raise SIGFPE 通过 SIGFPE 来调用处理过程 2 4 3对内存进行操作的标准库函数 memmove 与memcpy 内存copyMemmove考虑到相互覆盖memcpy速度比memmove快例 将buf从 RIGHT 改为 RIGRIGHT staticcharbuf R I G H T 0 Intmain inti for i 0 i 6 i buf i 3 buf i 2 4 4对内存进行操作的标准库函数 memcmp 与strncmp memcmp遇到NULL字符时不会结束memcmp 函数不能用来比较结构的值例 结构体比较structfoo shorts longl 分析 32位系统环境 structfoobyte 0 s的低位字节structfoobyte 1 s的高位字节structfoobyte 2 无用信息 使l从一个long类型边界开始 structfoobyte 3 无用信息 使l从一个long类型边界开始 structfoobyte 4 l的最低位字节structfoobyte 5 l的次低位字节structfoobyte 6 l的次高位字节structfoobyte 7 1的最高位字节 2 4 4对内存进行操作的标准库函数 strcpy 与memcpy strcpy 函数只能拷贝字符串 遇到NULL字符时结束memcpy 函数可以拷贝任意类型的数据 指定字节数使用规则拷贝字符串时 通常都使用strcpy 函数在拷贝其它数据时 通常都使用memcpy 函数 2 4 4对内存进行操作的标准库函数 例 include includetypedefstructcust str intid charlast name 20 charfirst name l5 CUSTREC 2 4 4对内存进行操作的标准库函数 例 voidmain void char src string Thisisthesourcestring chardest string 50 CUSTRECsrc cust CUSTRECdest cust printf Hello I mgoingtocopysrc stringintodest string n printf Done dest stringis s n strcpy dest string src string printf Encore Let scopyoneCUSTRECtoanother n prinft I llcopysrc custintodest cust n First intializethesrc custdatamembers src cust id 1 strcpy src cust last name Strahan strcpy src cust first name Troy memcpy 2 4 4 1日期概述 CoordinatedUniversalTime UTC 世界标准时间CalendarTime 日历时间epoch 时间点clocktick 时钟计时单元 2 4 4 2计时 C中的计时函数是clock lock tclock void defineCLOCKS PER SEC clock t 1000 2 4 4 2计时 实例 机器运行一个循环或者处理其它事件到底花了多少时间 include stdio h include stdlib h include time h intmain void longi 10000000L clock tstart finish doubleduration 测量一个事件持续的时间 printf Timetodo ldemptyloopsis i start clock while i finish clock duration double finish start CLOCKS PER SEC printf fseconds n duration system pause 2 4 4 2计时 实例 获得日历时间time ttime time t timer 代码分析 include time h include stdio h intmain void structtm ptr time tlt lt time NULL printf TheCalendarTimenowis d n lt return0 结果 TheCalendarTimenowis1122707619即从1970年1月1日0时0分0秒到此时的秒数 2 4 4 2计时 实例 获得日期和时间structtm gmtime consttime t timer 获得的世界标准时间是2005年7月30日7点18分20秒structtm localtime consttime t timer 获得的本地时间会比时间标准时间晚8个小时代码分析 include time h include stdio h intmain void structtm local time tt t time NULL local localtime 结果 Localhouris 15UTChouris 7 2 4 4 2计时 固定的时间格式格式 星期几月份日期时 分 秒年 n 0例如 WedJan0202 03 551980 n 0char a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 光的折射、透镜成象的课件其它
- 赣南师范大学科技学院《行政诉讼法》2023-2024学年第一学期期末试卷
- 赣南科技学院《职业生涯发展和就业指导Ⅲ》2023-2024学年第一学期期末试卷
- 赣东学院《机械设备故障诊断》2023-2024学年第一学期期末试卷
- 甘肃中医药大学《医学实验技术导论》2023-2024学年第一学期期末试卷
- 赣南科技学院《福利经济学》2023-2024学年第一学期期末试卷
- 2022年上海财经大学国际教育学院自考英语(二)练习题(附答案解析)
- 七年级科学上册8.1溶液的形成8.1.2水以外的溶剂学案无答案牛津上海版
- 三年级数学下册二图形的运动第1课时轴对称一教案北师大版
- 冬季行车安全培训课件
- 内控合规风险管理手册
- 教师工作职责培训课件建立良好的教师与学生关系
- 品管部年度工作总结
- 胃肠外科病人围手术期营养管理专家共识护理课件
- 2024届高考语文复习:小说叙述特色专题复习 课件
- 投放自助洗衣机合同书
- 四川省普通高中2024届高三上学期学业水平考试数学试题(解析版)
- 石油钻井机械设备故障预防与维护保养范本
- 浙江省温州市2023-2024学年七年级上学期期末数学试卷(含答案)
- 【全国最火爆的团建项目】旱地冰壶(拓展训练服务综合供应平台)
- 北京市西城区2023-2024学年五年级上学期期末数学试卷
评论
0/150
提交评论