写出完整版的strcpy函数——牛客网

此题为字符串的复制函数,自己书写测试代码和strcpy函数如下,测试环境(Ubuntu):

#include 

void  strcpy(char *strDest, const char *strSrc);

int main()
{
    char* str1 = "abc";  
    char* str2 = "bcd";
    
    strcpy(str1, str2);

    printf("str1 = %s, str2 = %s\n", str1, str2);

    return 0;
}

void strcpy(char *strDest, const char *strSrc)
{
    while ((*strDest++ = *strSrc++) != '\0');
}

测试结果报错:发生段错误,通过addr2line定位到while ((*strDest++ = *strSrc++) != '\0');这一行代码。
开始一直以为是这一行代码书写错误,将其分步改写,代码如下:

do
{
    *strDest = *strSrc;
    strDest++;
    strSrc++;
} while (*strSrc != '\0');

然后调试,还是发生了段错误,继续使用addr2line定位到*strDest = *strSrc;这一行代码。然后将代码copy到vs2015上调式,打印错误信息:Unhandled exception thrown: write access violation,即写访问冲突,因此怀疑是赋值时出现异常。仔细查看测试代码,发现定义的str1为字符串字面量,其内存地址存储在只读存储区不能作为左值使用。修改char str1[10] = "";,然后测试后通过。具体代码如下:

#include 

void  strcpy(char *strDest, const char *strSrc);

int main()
{
    char str1[10] = "";
    char* str2 = "bcd";
    
    strcpy(str1, str2);

    printf("str1 = %s, str2 = %s\n", str1, str2);

    return 0;
}

void strcpy(char *strDest, const char *strSrc)
{
    while ((*strDest++ = *strSrc++) != '\0');
}

查看示例代码,完善strcpy函数:

#include 
#include 

char* strcpy(char *strDest, const char *strSrc);

int main()
{
    char str1[10] = "";
    char str2[10] = "bcd";

    printf("str = %s\n", strcpy(str1, str2));

    return 0;
}

char* strcpy(char *strDest, const char *strSrc)
{
    assert((strDest != NULL) && (strSrc != NULL));
    
    char* addr = strDest;
    
    while ((*strDest++ = *strSrc++) != '\0');
    
    return addr;
}

你可能感兴趣的:(写出完整版的strcpy函数——牛客网)