C语言 百分网手机站

C语言中两个串函数的使用

时间:2020-09-26 16:45:31 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指向了一个字符串常量,使得后面的连接操作出错,即犯了“字符指针指向了一个串常量,然后又修改串常量的值”的错误。需要使用下一行的串拷贝函数替换它。

  同样,使用该函数时两个实参所指示的内存空间避免存在重叠区域。

  三、结语

  正确使用这两个函数的要点是第一个实参不能是指向一个字符串常量的字符指针,必须保证有足够的存储空间容纳新串。另外,在文章中对程序存储内存区域的划分并没有进行细致的阐述,原因在于这部分属于选讲内容,不会影响正确理解和使用这两个串操作函数。


【C语言中两个串函数的使用】相关文章:

c语言中有关随机函数的使用详解11-20

C语言中返回字符串函数的实现方法10-06

c语言中time函数的用法10-08

C语言中strpbr()函数的用法10-04

C 语言中宏的使用10-02

C++的字符串分割函数的使用详解10-04

C语言中isalnum()函数和isalpha()函数的对比11-21

C语言中函数的区分有哪些11-21

C 语言中返回字符串函数的四种实现方法09-28