C语言:strcpy函数和strncpy函数

05-28 1631阅读

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

前言

   在前面我们知道了字符串在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.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函数

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

C语言:strcpy函数和strncpy函数

   反过来发现可以正常执行

结论一:在使用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函数的地方。

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

    可以看到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
//我们还可以通过改变源字符串和目标字符串的初始位置,进行有选择的拷贝

例二:

C语言:strcpy函数和strncpy函数

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

C语言:strcpy函数和strncpy函数

       当要拷贝字节数大于源字符串长度时,strncpy函数使用NULL字符
  补充超出的空间;

结语:

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

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]