请问C语言中strcpy函数,dst和src不能重叠是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问C语言中strcpy函数,dst和src不能重叠是啥意思?相关的知识,希望对你有一定的参考价值。

答: strcpy函数用于字符串复制, 也就是说将源地址(src)里面的内容复制到目的地址(dst)指向的位置,自然dst和src的地址不能是同一个,不然的话就地复制也没有意义。希望能够帮助到你。

参考技术A strcpy是字符串复制函数,
dst是destination的缩写表示目的地,也就是往哪里复制;
src是source的缩写表示源,也就是从哪里复制。
不能重叠说的是两个指针所指向的内存地址不能有交叉。本回答被提问者采纳
参考技术B dst和src都指向一片内存,所谓不能重叠就是两块内存彼此重叠啊 参考技术C 这个要从汇编看,就很好理解二个参数为什么不能指向同一地址了

strcpy()函数详解

strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下:

  • 函数声明以及实现代码
char *strcpy(char *dst, const char *src);
char * strcpy(char *dst,const char *src)   
{
    if((dst==NULL)||(src==NULL))
         
           return NULL; 
 
    char *ret = dst; //[1]
 
    while ((*dst++=*src++)!='\\0'); //[2]
 
    return ret;//[3]
}


(1)const 修饰:源字符串参数用const修饰,防止修改源字符串;

(2)空指针检查:源指针和目的指针都有可能会出现空指针的情况,所以应该对其进行检查;

(3)为什么要设置ret 指针以及返回ret指针的位置[3],由于目的指针dst已经在进行移动了,所以用辅助指针ret表明首指针;

(4)以上所示[2]处,为简单的字符串的复制过程,正好表明strcpy函数遇到'\\0'将会停止;

  • 示例说明

之前在某处看到过这个问题,以下将对其进行详解,

  • 最终答案输出是 "ABC\\0";
  • 为什么答案不是"ABC\\0ef";

[1]从strcpy函数的实现代码可以看出当src指针指向为‘\\0’时将会停止字符串的复制,由此可以得知返回ret指针所指向的数组a内容应该是 “ABC\\0ef”,也就是说实际内存数组a中的内容应该是“ABC\\0ef“;但是为什么最终显示会是"ABC\\0"呢,原因在于,strcpy的本身属性:即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符;

基于此种原因,但是字符串的特性是什么呢?字符串最后一个字节存放的是一个空字符——“\\0”,用来表示字符串的结束。把b复制到a之后会令b的空字符把复制后的字符串隔断,所以最终printf输出只能是"ABC\\0";

【注】此函数的第一个属性,会返回ret,也就是第一次,dst赋给ret的首地址,如

char *a="coda";
      char b[MAX]="you are the best one.";
      char *p;
      p=strcpy(b+8,a);
      puts(p);

输出结果为:coda

可能到这里你已经发现了一些问题,如果想把一个字符串的一部分复制到另一个字符串的某个位置,该怎么办呢,显然strcpy()函数是满足不了这个功能的,strncpy()函数是为了弥补strcpy()函数不能检查目标字符串是否容纳下源字符串的不足而设定的一个函数。并且完全可以实现这个功能。

以上是关于请问C语言中strcpy函数,dst和src不能重叠是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

strcpy()函数详解

C 实现strcmp,strcpy,strcat函数

strcpy函数用法

Strcpy函数的实现

C语言中strcat和strcpy的区别

一个关键的函数——strcpy的实现