C语言:strcpy函数和strncpy函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在前面我们知道了字符串在C语言的地位是比较高的,c库提供的配套函 数肯定少不了。
今天我们介绍:strcpy函数和strncpy函数。
`
一、strcpy函数
1、strcpy函数的功能是什么?
首先我们要知道,C语言并没有提供用于存储字符串的数据类型,字 符串的存储是使用数组的方式来完成的(在上一篇博客中我们仔细介绍 过,所以这里就不展开来讲了)
通常对于int,char,long,double等类型变量,我们可以直接通过**‘=’**来进行赋值操作,但是对于字符串来说,种方法就行不通了。例如:
char ch1[] = "abcd"; char ch2[] = "1234";//数组名是首元素的地址 ch1 = ch2;//这样进行赋值操作仅仅改变了ch1的指向的空间,并不会改变原空间中的内容
要是想达到想要的效果,那我们只能派strcpy()上场了。strcpy是string copy的缩写,从名字很容易看出,它是用于字符串拷贝的,下面我们来学习一下,它的具体使用方法
2.strcpy函数使用
下面是strcpy()函数在c库中的定义
我们不难看出:
一、函数的参数
1.chardestination---------目标字符串的首地址
2.const charsource-------源字符串首地址(const修饰防止被修改)
二、返回类型
1.char*----------返回目标字符串首地址
三、函数具体功能
将源字符串中的内容拷贝到目标字符串中,直到遇到NULL(这里指的是‘\0’)停止,这也说明NULL为结束标识符(记住哈,下面要考)
下面我们通过具体的例子来学习使用技巧和需要注意的地方
具体使用:
场景一:
char ch[] = "abcdef"; printf("%s\n", strcpy(ch, "123456"));//执行结果为:123456
场景二:
char ch1[] = "abcdef"; char ch2[] = "123456"; printf("%s\n", strcpy(ch2, ch1));//结果为:abcdef //将ch2拷贝为ch1,并返回ch2地址打印
场景三:
这个是比较有用的技巧
char ch1[] = "abcdef"; char ch2[] = "123456"; printf("%s\n", strcpy(ch2, ch1+2));//执行结果:cdef //从ch1下标为二的位置开始拷贝给ch2
使用注意事项:
例一:
从上面代码看以看到ch1与ch2相比不含有字符串结束标志’\0’,在执行strcpy函数时,该函数在遇到’\0’之前便不会停止,发生越界访问,使拷贝结果发生错误!!!!
反过来发现可以正常执行
结论一:在使用strcpy函数对字符串进行操作时,源字符串必须包含NULL(‘\0’)。
例二:
char ch1[5] = "1234"; char ch2[10] = "abcdefghi"; printf("%s\0", strcpy(ch1, ch2)); //这个程序是会崩溃的,大家可在电脑上试一下
从上面展示的代码,我们很明显的可以看出,ch2所需空间远大于ch1拥有的空间,这就会导致在拷贝时会发生溢出现象(栈溢出,不懂的可以去了解一下)。
结论二:在使用strcpy函数拷贝字符串时,我们要先判断,目标字符串所拥有的空间是否有能力容纳源字符串,避免发生蛇吞象现象!!!
有没有方法能避免这种错误发生吗?或是我只想拷贝源字符串的一部分 到目标字符串该怎么做呢?这就需要请strncpy函数出来主持大局了。
二、strncpy函数
这个函数可以完成strcpy函数的所有功能,我们就不再赘述了,下面 我们主要讲一下strncpy函数优于strcpy函数的地方。
可以看到strncpy()相较于strcpy()多了一个参数,我们重点来看一 下这个参数;
size_t num-------要拷贝字节数(1、size_t :无符号整型;2、一个char类型数据只占一个字节,所以这里字节数就是要拷贝字符个数)。
strncpy函数的使用
这里我们只举两个简单的例子(这个函数可以类比strcpy函数理解)
例一:
char ch1[5] = "1234"; char ch2[10] = "abcdefghi"; printf("%s\0", strncpy(ch1, ch2,2));//运行结果为:ab34 //可以看到我们只拷贝源字符串的前两个给目标字符串
char ch1[5] = "1234"; char ch2[10] = "abcdefghi"; printf("%s\0", strncpy(ch1+1, ch2+1,2));//执行结果:1bc4 //我们还可以通过改变源字符串和目标字符串的初始位置,进行有选择的拷贝
例二:
(下面这个图是通过调试看到,执行过strncpy函数后ch2内部存储情况)
当要拷贝字节数大于源字符串长度时,strncpy函数使用NULL字符 补充超出的空间;
结语:
函数的功能是很灵活的,希望大家多去尝试,在实践中发问题,一定要去模拟实现一下函数的功能,这种方法可以帮助我们理解的更透彻!!!!