关于模拟实现strcat函数的问题!(语言-c语言)

请问这个模拟实现strcat函数中为啥结果是hello而不是hello world,哪里出错了


char* my_strcat(char* dest, char* src)
{
    char* ret = dest;

    assert(dest && src);
    while (*dest++)
    {
        ;
    }
    
    while (*dest++=*src++)
    {
        ;
    }
    
    return ret;
}
int main()
{
    char arr1[20] = "hello ";
    char arr2[] = "world";
    my_strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

这个循环条件会将指针增加到目标字符串的末尾,但它也会多增加一次,使其指向字符串末尾的空字符。然后,在下一个循环中,源字符串将从空字符开始复制到目标字符串中,从而覆盖它。

while (*dest)
{
    dest++;
}

验证:

#include <stdio.h>
#include <assert.h>
#include <string.h>//src是要被追加的  不能变所以加const1
char *my_strcat(char *dest,const char* src){
    assert(dest!=NULL);//两种写法都可以
    assert(src);//加NULL更有体现
    //1.找到目的字符串\0位置
    char *ret=dest;
    while(*dest!='\0'){
        dest++;
    }
    
    
    //2.追加   
    while(*dest++=*src++){
        ;
    }return ret;
    
}

int main(){
    
    char arr1[]="hello";
    char arr2[]="world";
    
    my_strcat(arr1,arr2);
    printf("%s\n",arr1);}
    /*
    //遇到\0结束
    char arr1[]="hello";
    char arr2[]="wo\0    rld";
    
    strcat(arr1,arr2);
    printf("%s",arr1);
}*/

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7432967
  • 你也可以参考下这篇文章:【c语言】模拟实现strcat函数
  • 你还可以看下c语言参考手册中的 c语言-strcat()
  • 除此之外, 这篇博客: 【C库函数】strcat函数详解中的 函数原型 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • char *strcat( char * destination, const char source );

  • 您还可以看一下 李国政老师的c/c++基础学习实战课程中的 5-11、strcat小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    在你的实现中,可能没有删除dest原来末尾的"\0",导致拼接的字符串不是预期的结果。你可以尝试先在dest字符串末尾找到"\0"的位置,然后从该位置开始复制src的字符串,最后在dest新的末尾加上"\0"来表示字符串结束。

    下面是一种实现方式:

    char *my_strcat(char *dest, const char *src) {
        int dest_len = strlen(dest);
        int i;  
        for (i = 0; src[i] != '\0'; i++) {
            dest[dest_len + i] = src[i];
        }
        dest[dest_len + i] = '\0';  // 添加字符串结束标志
        return dest;
    }
    

    注意,在调用my_strcat函数时,dest必须已经足够长,能够容纳src的字符串。如果不确定长度,可以使用动态内存分配函数malloc来分配一个足够大的字符串。例如:

    char *dest = (char *)malloc(strlen("hello") + strlen(" world") + 1);
    strcpy(dest, "hello");
    my_strcat(dest, " world");
    printf("%s\n", dest);
    free(dest);  // 记得释放内存
    

    这样就可以得到预期的输出"hello world"。