深入学习C语言知识点.docVIP

  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文档。上传文档
查看更多
深入学习C语言知识点

深入学习C语言知识点 深入学习C语言知识点checklist——测试你掌握C的程度的答案 2011-05-03 16:06:08| 分类: 编程 | 标签: |字号大 中 小 订阅 深入学习C语言知识点checklist——测试你掌握C的程度的答案 前些日子在网上转载了一篇日志《关于深入学习C语言知识点checklist——测试你掌握C的程度》,这篇文章的引用真是无所不在,但找不到关于它的答案。于是突发奇想,用了两天时间整理了篇答案。全是自己的见解,希望对大家的学习有帮助。 一.字符串 (1)strlen()函数的返回值是什么类型的? strlen()函数的返回类型是unsigned int,在此需要注意unsigned int的一些操作。两个unsigned int的操作结果还为unsigned int,unsigned int和int的操作结果会自动转换为int。所以如果使用if(strlen(a) - strlen() 0)这样的判断语句,结果永远为真。 (2)字符串strlen()的值,是否和他占据的内存空间相同? strlen()函数得到的长度是从字符串始地址开始到空字符的字节数,并不包括最后的空字符。 (3)你是否知道strcpy函数存在的潜在风险?如何避免? strcpy(char *a, char *b)函数将b字符串整个复制到从a开始的地址处,复制后字符串a和b完全一样。如果b的长度大于a初始长度,就会将a后面的内存部分覆盖掉。标准C这样设计库函数体现了C语言的灵活性,这需要程序员自己设计安全的程序。要想避免溢出,必须确保b的长度不大于a的初始长度。或者给a重新分配更大长度的内存地址,将b复制进去。C中有限制复制长度的标准函数strcpy(char *a, char *b, size_t len),这个函数只从b中复制len个字符到a,但a的结果将不是以NUL字节结尾。如果使用这个函数,最后必须自己添加代码,将适当内存写为‘\0’,一般a[len - 1] = \0; (4)如果一个字符串没有字符串结束符,而调用str开头的库函数,会发生什么? 如果一个字符串没有字符串结束符,而调用str开头的库函数,返回的结果是从初始地址开始到它之后为\0的内存处为止中间的字节数。 (5)Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()内部到底是如何运行的?这些函数到底对源字符串和目标字符串做了些什么?你是否观察过它们运行时两个字符串内存的变化? strcpy(char *a, char *b)函数将b中的字符串复制到字符串a的起始地址处,将a原来的字符串覆盖,以\0结尾。 strcat(char *a, char *b)函数从字符串a的下一个地址(即从‘\0’开始)为初始地址,将b复制到此处,以\0结尾。如果a和b重叠,结果不可预测。 strcmp(char const *a, char const *a),按照字典排序的顺序,如果a小于b,返回小于零的值;如果a大于b,返回大于零的值。如果两字符串相等,返回0。 strncpy,strncat和strncmp分别比strcpy,strcat,strcmp多了一个参数size_t len。和strcpy一样,strncpy把源字符串的字符复制到目标数组。然而它总是正好向a写入len个字符。如果strlen(b)的值小于len,a数组就用额外的nul字节填充到len长度。如果strlen(b)大于len,那么只有len个字符被复制到a中。注意!它的结果不会以nul字节结尾。 strncat和strcat类似,不过它只会复制len个字符添加到a的后面。和strncpy不同的是,它以nul作为结尾。strncat()最多向目标数组复制len个字符(再加一个结尾的nul字节),它才不管目标a除去原来存在的字符串后留下的空间够不够。 strncmp()最多只比较前len个字符,功能和strcmp()类似。 具体实现见标准函数库,个人觉得实现没有难度,很容易实现。 (6)上面这些函数使用时,各有哪些需要注意的地方?你会几种字符串查找操作?c语言中有字符串这个数据类型吗?对字符串进行操作的时候,是否为字符串结尾符预留存储位置不然的话容易造成非法访问内存。 上面几个函数需要注意的地方都已指出。 个人觉得这些字符串操作都要熟悉! 其实char *就相当于字符串类型,string.h中的所有库函数几乎都是针对字符指针操作的。 答案是:是!字符串必须以\0结尾,才能识别到结束,否则会一直

文档评论(0)

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

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

1亿VIP精品文档

相关文档