C语言strcpy函数问题


char* strcat(char* str1,char* str2)
{
    char* p = str1;  //为什么要定义的*p来使用  为什么不用str1
    while (*p!='\0')
        p++;
    while (*str2!='\0')
    {
        *p = *str2;
        p++;
        str2++;
    }
    *p = '\0';
    return str1;
}

因为p要改变指针,最后p指向\0了,你return p能行吗
除非这函数不要返回值了,那你就随便改str1

以下答案引用自GPT-3大模型,请合理使用:

说明



char *strcat(char *str1,char *str2)
{
    char* p = str1; //为什么要定义的*p来使用  为什么不用str1
    while (*p!='\0')
        p++;
    while (*str2!='\0')
    {
        *p = *str2;
        p++;
        str2++;
    }
    *p = '\0';
    return str1;
}

strcat的作用是把str1和str2连接起来,并返回str1。由于str1和str2都是char*类型的变量,所以在连接的时候会将变量p的值从str1复制到str2,然后再将str2的值复制回str1。这样做的目的是为了避免两个变量之间的重复修改。

如果我的回答解决了您的问题,请采纳我的回答

供参考:

#include <stdio.h>
#include <assert.h>
char* strcpy(char* des, const char* source)
{
    char* r = des;
    assert((des != NULL) && (source != NULL));
    while ((*r++ = *source++) != '\0');
    return des;
}
char* strcat(char* str1, char* str2)
{
    char* p = str1;  //定义的指针 p 指向字符串 str1 首地址 
    while (*p != '\0') p++; //通过循环,让指针 p 移动到 str1 字符串的末尾字符'\0'处 
    while (*str2 != '\0') *p++ = *str2++; // 将字符串 str2 首地址开始的字符复制到 str1 的末尾
                                          //即指针 p 指向的位置, 一个一个复制,直到 str2 末尾处。  
    *p = '\0'; // 在指针 p 指向的末尾处加上字符串结束标志 '\0'                   
    return str1; // 函数需要返回的是 str1 字符串的首地址,str1 的指向是始终无变化的。
}

该回答引用ChatGPT
这段代码实现了字符串的拼接,但是它没有考虑内存的分配问题。如果str1的内存空间不足以存储str1和str2的内容,那么就会发生缓冲区溢出。

为了避免这个问题,我们可以先在代码中判断str1的内存空间是否足够,然后动态分配内存空间。另外,这段代码中的strcat函数的签名不符合标准的strcat函数的签名,因为标准的strcat函数的第二个参数是常量字符串,而不是字符串变量。

楼上总结的非常好,建议LZ 采纳