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语言中gets()函数知识
导语:gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。。下面是C语言中gets()函数知识,一起来学习下吧:gets()函数用于从缓冲区中读取字符串,其原型如下:char*gets(cha...
-
C与C++之间相互调用的实例方法
如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用__cplusplus预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用。下面是小编为大家...
-
浅谈高职C语言课程的教学分析与设计
C语言作为学院网络技术专业的人门课程,旨在通过锻炼学生的逻辑思维,墙养学生在职业岗位中实际应用的能力.目前,该专业的学生毕业后主要从事网站开发和网络管理等方面的工作,而在这些领域几乎都以C语言作为应用的开发工具.但从历年教学实践来看,教师往往付出的精力多...
-
C语言的第一个程序
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的`编程语言。下面小编带大家看看第一个C语言程序。第一个C语言程序实例说明输出"Hello,world!"是...