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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。