II. C语言本质_24 函数接口_1 本章的预备知识.docVIP

II. C语言本质_24 函数接口_1 本章的预备知识.doc

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
II. C语言本质_24 函数接口_1 本章的预备知识

第?24?章?函数接口 1.?本章的预备知识 这一节介绍本章的范例代码要用的几个C标准库函数。我们先体会一下这几个函数的接口是怎么设计的,Man Page是怎么写的。其它常用的C标准库函数将在下一章介绍。 1.1.?strcpy与strncpy 从现在开始我们要用到很多库函数,在学习每个库函数时一定要看Man Page。Man Page随时都在我们手边,想查什么只要敲一个命令就行,然而很多初学者就是不喜欢看Man Page,宁可满世界去查书、查资料,也不愿意看Man Page。据我分析原因有三: 英文不好。那还是先学好了英文再学编程吧,否则即使你把这本书都学透了也一样无法胜任开发工作,因为你没有进一步学习的能力。 Man Page的语言不够友好。Man Page不像本书这样由浅入深地讲解,而是平铺直叙,不过看习惯了就好了,每个Man Page都不长,多看几遍自然可以抓住重点,理清头绪。本节分析一个例子,帮助读者把握Man Page的语言特点。 Man Page通常没有例子。描述一个函数怎么用,一靠接口,二靠文档,而不是靠例子。函数的用法无非是本章所总结的几种模式,只要把本章学透了,你就不需要每个函数都得有个例子教你怎么用了。 总之,Man Page是一定要看的,一开始看不懂硬着头皮也要看,为了鼓励读者看Man Page,本书不会像[KR]那样把库函数总结成一个附录附在书后面。现在我们来分析strcpy(3)。 图?24.1.?strcpy(3) 这个Man Page描述了两个函数,strcpy和strncpy,敲命令man strcpy或者man strncpy都可以看到这个Man Page。这两个函数的作用是把一个字符串拷贝给另一个字符串。SYNOPSIS部分给出了这两个函数的原型,以及要用这些函数需要包含哪些头文件。参数dest、src和n都加了下划线,有时候并不想从头到尾阅读整个Man Page,而是想查一下某个参数的含义,通过下划线和参数名就能很快找到你关心的部分。 dest表示Destination,src表示Source,看名字就能猜到是把src所指向的字符串拷贝到dest所指向的内存空间。这一点从两个参数的类型也能看出来,dest是char *型的,而src是const char *型的,说明src所指向的内存空间在函数中只能读不能改写,而dest所指向的内存空间在函数中是要改写的,显然改写的目的是当函数返回后调用者可以读取改写的结果。因此可以猜到strcpy函数是这样用的: char buf[10]; strcpy(buf, hello); printf(buf); 至于strncpy的参数n是干什么用的,单从函数接口猜不出来,就需要看下面的文档。 图?24.2.?strcpy(3) 在文档中强调了strcpy在拷贝字符串时会把结尾的\0也拷到dest中,因此保证了dest中是以\0结尾的字符串。但另外一个要注意的问题是,strcpy只知道src字符串的首地址,不知道长度,它会一直拷贝到\0为止,所以dest所指向的内存空间要足够大,否则有可能写越界,例如: char buf[10]; strcpy(buf, hello world); 如果没有保证src所指向的内存空间以\0结尾,也有可能读越界,例如: char buf[10] = abcdefghij, str[4] = hell; strcpy(buf, str); 因为strcpy函数的实现者通过函数接口无法得知src字符串的长度和dest内存空间的大小,所以“确保不会写越界”应该是调用者的责任,调用者提供的dest参数应该指向足够大的内存空间,“确保不会读越界”也是调用者的责任,调用者提供的src参数指向的内存应该确保以\0结尾。 此外,文档中还强调了src和dest所指向的内存空间不能有重叠。凡是有指针参数的C标准库函数基本上都有这条要求,每个指针参数所指向的内存空间互不重叠,例如这样调用是不允许的: char buf[10] = hello; strcpy(buf, buf+1); strncpy的参数n指定最多从src中拷贝n个字节到dest中,换句话说,如果拷贝到\0就结束,如果拷贝到n个字节还没有碰到\0,那么也结束,调用者负责提供适当的n值,以确保读写不会越界,比如让n的值等于dest所指向的内存空间的大小: char buf[10]; strncpy(buf, hello world, sizeof(buf)); 然而这意味着什么呢?文档中特别用了Warning指出,这意味着dest有可能不是以\0结尾的。例如上面的调用,虽然把hello world截断到10个字符拷贝至buf中,但buf不是以\0结尾的,如果再printf(buf)就

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档