【C语言】自定义 strcpy 函数的优化

【C语言】自定义 strcpy 函数的优化,第1张

 strcpy函数

 第一次代码:

#include
void my_strcpy(char* a1, char* a2)
{
    while (*a2 != '\0')
    {
        *a1 = *a2;
        a1++;
        a2++;
    }
    *a1 = *a2;
}
int main()
{
    char arr1[] = { "helloworld" };
    char arr2[] = { "world" };
    my_strcpy(arr1, arr2);
    printf("%s", arr1);
    return 0;
}

 第二次代码:

a1++、a2++ 可以在 *a1++  和  *a2++

#include
void my_strcpy(char* a1, char* a2)
{
    while (*a2 != '\0')
    {
        *a1++ = *a2++;
    }
    *a1 = *a2;
}
int main()
{
    char arr1[] = { "helloworld" };
    char arr2[] = { "world" };
    my_strcpy(arr1, arr2);
    printf("%s", arr1);
    return 0;
}

 第三次代码:

*a1++  =  *a2++ 写进  while循环的判断里,*a1 = *a2 可以省略

#include
void my_strcpy(char* a1, char* a2)
{
    while (*a1++ = *a2++)
    {
        ;
    }
    //*a1 = *a2;
}
int main()
{
    char arr1[] = { "helloworld" };
    char arr2[] = { "world" };
    my_strcpy(arr1, arr2);
    printf("%s", arr1);
    return 0;
}

第三次代码: 

考虑 arr2 为空指针 NULL 的情况:对 arr2   arr1  进行判断

#include
void my_strcpy(char* a1, char* a2)
{
    if (a1 != NULL && a2 != NULL)
    {
        while (*a1++ = *a2++)
        {
            ;
        }
    }
}
int main()
{
    char arr1[] = { "helloworld" };
    char arr2[] = { "world" };
    my_strcpy(arr1, arr2);
    printf("%s", arr1);
    return 0;
}

 第四次代码:

 上面的方法只能规避空指针但不能很好的找到bug ,使用断言可以很好的找到问题

 断言函数需要用到头文件 assert.h

 assert 对指针进行判断,如果为空指针则程序会报错

#include
#include
void my_strcpy(char* a1, char* a2)
{
    assert(a1 != NULL);
    assert(a2 != NULL);
    while (*a1++ = *a2++)
    {
        ;
    }
}
int main()
{
    char arr1[] = { "helloworld" };
    char arr2[] = { "world" };
    my_strcpy(arr1, arr2);
    printf("%s", arr1);
    return 0;
}

如果函数 my_strcy 函数的形式参数中有控制指针 assert 断言就会报错

 第五次代码:

 如果出现将 *a1*a2 位置写反的情况,会出现可能不符合程序要求的错误

这里使用 const

#include
#include
void my_strcpy(char* a1, const char* a2)
{
    assert(a1 != NULL);
    assert(a2 != NULL);
    while (*a1++ = *a2++)
    {
        ;
    }
}
int main()
{
    char arr1[] = { "helloworld" };
    char arr2[] = { "world" };
    my_strcpy(arr1, arr2);
    printf("%s", arr1);
    return 0;
}

 如果指针 *a2 被修改则程序会报错

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/676361.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存