C语言:strcpy函数和strncpy函数

2024-06-04 4536阅读

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

   在前面我们知道了字符串在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库中的定义

C语言:strcpy函数和strncpy函数 第1张

我们不难看出:

一、函数的参数

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

使用注意事项:

例一:

C语言:strcpy函数和strncpy函数 第2张

从上面代码看以看到ch1与ch2相比不含有字符串结束标志’\0’,在执行strcpy函数时,该函数在遇到’\0’之前便不会停止,发生越界访问,使拷贝结果发生错误!!!!

C语言:strcpy函数和strncpy函数 第3张

   反过来发现可以正常执行

结论一:在使用strcpy函数对字符串进行操作时,源字符串必须包含NULL(‘\0’)。

例二:

char ch1[5] = "1234";
char ch2[10] = "abcdefghi";
printf("%s
    有没有方法能避免这种错误发生吗?或是我只想拷贝源字符串的一部分
到目标字符串该怎么做呢?这就需要请strncpy函数出来主持大局了。
", strcpy(ch1, ch2)); //这个程序是会崩溃的,大家可在电脑上试一下

从上面展示的代码,我们很明显的可以看出,ch2所需空间远大于ch1拥有的空间,这就会导致在拷贝时会发生溢出现象(栈溢出,不懂的可以去了解一下)。

结论二:在使用strcpy函数拷贝字符串时,我们要先判断,目标字符串所拥有的空间是否有能力容纳源字符串,避免发生蛇吞象现象!!!

二、strncpy函数

      这个函数可以完成strcpy函数的所有功能,我们就不再赘述了,下面
 我们主要讲一下strncpy函数优于strcpy函数的地方。
    可以看到strncpy()相较于strcpy()多了一个参数,我们重点来看一
下这个参数;

我们先看,ck库数组名定义这个函数的:C语言:strcpy函数和strncpy函数 第4张

strncpy函数的使用

size_t num-------要拷贝字节数(1、size_t :无符号整型;2、一个char类型数据只占一个字节,所以这里字节数就是要拷贝字符个数)。

  这里我们只举两个简单的例子(这个函数可以类比strcpy函数理解)
	char ch1[5] = "1234";
	char ch2[10] = "abcdefghi";
	printf("%s
	char ch1[5] = "1234";
	char ch2[10] = "abcdefghi";
	printf("%s
       当要拷贝字节数大于源字符串长度时,strncpy函数使用NULL字符
  补充超出的空间;
", strncpy(ch1+1, ch2+1,2));//执行结果:1bc4 //我们还可以通过改变源字符串和目标字符串的初始位置,进行有选择的拷贝
", strncpy(ch1, ch2,2));//运行结果为:ab34 //可以看到我们只拷贝源字符串的前两个给目标字符串

例一:

结语:

例二:

C语言:strcpy函数和strncpy函数 第5张

(下面这个图是通过调试看到,执行过strncpy函数后ch2内部存储情况)

C语言:strcpy函数和strncpy函数 第6张

函数的功能是很灵活的,希望大家多去尝试,在实践中发问题,一定要去模拟实现一下函数的功能,这种方法可以帮助我们理解的更透彻!!!!


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]