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语言 字符串 串拷贝 串连接   引言   在C语言程序设计中,字符串是一个重要的概念,针对字符串的操作函数使用频率很高,特别是串拷贝、串连接函数,对于初学者来说很容易发生错误,且会感到莫名其妙。因为这两个函数的使用涉及到的知识点多、难度大,因而普通的教材或参考书要么不讲,要么浅尝则止。这种处理方式有利有弊。下面将以实例的方式进行问题的探究。   一、串拷贝函数(strcpy)   strcpy俗称“串拷贝”函数,是将一个字符串的内容拷贝到另一个字符串中,完成字符串复制功能。   strcpy函数原型如下:   char *strcpy(char *dest, char *src)[1];   从函数原型来看:两个形式参数都是字符指针,返回值的类型也是字符指针,且值就是目标串的存储地址。这是基本的知识。   (一)用字符数组存储字符串   程序在VC6.0中编译、连接没有错误,但运行就会报错,错误信息(关键信息是图中的画线部分)如图1所示。   虽然可以通过调试的方式找出出错的深层次原因,但难度较大。出错的原因在于目标串dest(实参1)的内存空间不足以全部容纳源串src(实参2)的所有字符。因为目标串只占用6个字节的内存空间,而源串占用了10个字节的内存空间,串拷贝时发生了数组溢出,出现数组下标越界的情况。这就是最常见的 “缓冲区溢出”错误[2]。   我们在编程时没有检查下标,并且引用了超出数组边界的元素而导致错误,要想避免这种情况就必须保证目标串占驻的空间不小于源字符串的空间。   其中N应该是一个不小于sizeof(src)的常量。sizeof(src)与strlen(src)+1在数量上相等但意义不同,不能代换。原因在于sizeof(src)是一个运算符组织成的常量表达式,而strlen(src)+1是一个函数运算组成的表达式,两者存在本质差别。   (二)用字符指针存储字符串   前面的例子是用字符数组存储字符串,而下面的例子则是用字符指针存储字符串。   很明显dest的内存空间足够容纳src数组中的全部字符。但是当我们在VC6.0中运行时仍会报错(错误信息与图1所示的类似),这又是为什么呢?因为在执行语句char *dest = 12345时,在栈中会为dest指针分配一个空间,而12345字符串则是存储于文字常量区,指针变量的值就是这个串常量所在内存空间的存储地址,而文字常量区中的数据是不能改变的,因此不能够通过dest指针来改变字符串常量12345的值,一旦试图改变文字常量区的数据则会出现错误。   因此,不能也不要企图通过串拷贝的方式改变一个字符串常量的值。   修正方法是将变量dest的类型改为字符数组,即char dest[6]或者char dest[]=12345;   (三)目标指针指向不确定   因此,在进行串拷贝操作时,两个指针所指向的内存空间应避免重叠。   对上述内容做一个总结,在使用串拷贝函数时:   第一个参数(实参)在类型上可以是字符数组,也可以是字符指针。是字符数组的话,该数组必须拥有足够大的存储空间(如例1);是字符指针的话,必须有确定的指向且必须拥有足够大的存储空间(如例3),但不能指向一个字符串常量(如例2)。   第二个参数(实参)可以是存储字符串的字符数组、字符串常量、字符指针(该指针指向一个字符数组、或者另一字符指针、或者字符串常量)。   两个实参在内存空间上最好不要有重叠区域(如例4)。   二、串连接函数(strcat)   串连接函数的原型是char *strcat(char *dest,char *src)[4];功能是将两个串dest、src连接起来组合成一个新字符串dest,并返回新串的存储地址,这个地址仍是dest的值;用法上与串拷贝函数类似。   串连接函数的第一个实参可以是字符数组,也可以是字符指针,都必须拥有足够的存储空间,以便存储连接后的新字符串。例子中被注释掉的那条语句本身没有错误,但它使得指针dest2指向了一个字符串常量,使得后面的连接操作出错,即犯了“字符指针指向了一个串常量,然后又修改串常量的值”的错误。需要使用下一行的串拷贝函数替换它。   同样,使用该函数时两个实参所指示的内存空间避免存在重叠区域。   三、结语   正确使用这两个函数的要点是第一个实参不能是指向一个字符串常量的字符指针,必须保证有足够的存储空间容纳新串。另外,在文章中

文档评论(0)

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

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

1亿VIP精品文档

相关文档