上面是输入,下面是输出,搞不明白原理

img

题主你用strcpy的时候,使用了取地址符&,导致将s[2]的地址复制给了s[0],所以输出时,读入s[0]的地址是s[2]的,又因为字符串连续存储,所以就将s[2]以及它后面的输出了

已知strcpy函数的原型是:

char *strcpy(char *dst, const char *src);

实现strcpy函数
解释为什么要返回char *
假如考虑dst和src内存重叠的情况,strcpy该怎么实现
https://blog.csdn.net/zx249388847/article/details/51751775

strcpy第一个参数是要复制到字符串到哪个地址,而第二个参数是要复制的字符串地址,
strcpy函数复制了"dfg"这个字符串到数组s开头位置,把字符串结束的空字符'\0'也复制过去了,所以导致结果是打印'dfg'。
可以在strcpy复制之前打印一次数组里面的值,然后复制了之后再打印一次数组的值,观察数组在strcpy使用之前和使用之后数组的值的变化。


#include <stdio.h>
#include <string.h>

int main(){
    char s[7];
    int i,j;
    gets(s);
    for(i=0;i<7;i++){
        printf("s[%d]=%c\n",i,s[i]);
    } 
    for(i=1;i<2;i++){
        strcpy(&s[0],&s[2]);
    }
    
    puts(s);
    for(i=0;i<7;i++){
        printf("s[%d]=%c\n",i,s[i]);
    } 
    return 0;
}

首先字符串是以\0结尾的,只是没有显示而已,asdfg\0 ,在你这里strcmp函数将从数组第三个元素地址的内容读取到结尾\0
的内容拷贝到数组中 ,此时数组前四个元素为dfg\0
所以puts函数打印时以\0为结束点 ,所以是dfg,如果有帮助,还请点个采纳哈哈(((o(゚▽゚)o)))