C语言:模拟实现strcpy函数与strcat函数

strcpy函数:
首先我们来了解一下strcpy函数的功能和用法:strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。也就是将一个字符串拷贝到另一个字符串中。

那接下来我们看如何具体实现。我们的基本思想是定义两个指针src和dest,分别指向源字符串和目标字符串。当源字符串指针没有走到’\0’即字符串结束标志时,我们将源字符串指针所指向的值赋值给目标字符串指针所指向的值,然后将两个指针向后移动,直至源字符串指针走到’\0’,循环结束,此时,我们已经完成了我们的拷贝。

下面是具体实现代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* my_strcpy(char* dest, const char* src)//源字符串指针变量是不改变的,所以用const修饰,以起到保护作用
{
    assert(dest != NULL);//断言指针不为空
    assert(src != NULL);//断言指针不为空
    char* ret = dest;//将dest的地址存放在临时指针变量ret中,因为dest在循环体内要发生变化。此后dest变化会引起ret变化,但ret变化不会引起dest变化

    /* *dest++ = *src++语句的结果是*src赋给*dest的值,如果不是'\0',进行循环,如果是'\0',循环结束,跳出循环。
       此处要使用后置++,将赋值,再进行++运算,这样最后才能将'\0'也赋值到目标字符串中*/
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

int main()
{
    char arr1[20] = { 0 };
    char* arr2 = "abcdefg";
    char* s = NULL;
    s = my_strcpy(arr1, arr2);
    printf("%s\n",s);
    system("pause");
    return 0;
}

运行结果如下图:
这里写图片描述

strcat函数:
同样,我们在模拟实现之前先看一下它的功能和用法:strcat函数的功能是把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)。即将一个字符串拼接到另一个字符串的后面,也就是将源字符串的第一个字符拷贝至目标字符串的’\0’处,完成拼接功能。

那么下面我们来看下怎么模拟实现这个strcat函数:我们的基本思想是先使用循环将目标字符串指针移到’\0’的位置,然后再将源字符串拷贝至目标字符串。

下面是具体实现代码,供大家参考:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

/*基本思想:strcat函数是字符串拼接函数,即将一个字符串拷贝至另一个字符串的后面,即将源字符串的第一个字符拷贝到目标字符串
            的'\0'处。我们在实现代码时可以先将目标字符串指针循环走至'\0'处,再将源字符串拷贝到'\0'处。*/

char* my_strcat(char* dest, const char* src)
{
    assert(dest != NULL);
    assert(src != NULL);
    char* ret = dest;//将dest的地址存放在临时指针变量ret中。因为dest在循环体内要发生变化。dest变化会引起ret变化,但ret变化不会引起dest变化
    while (*dest != '\0')//dest的指针指向'\0'时,循环结束,此时dest的指针走到'\0'处
    {
        dest++;
    }

    /*循环条件中语句的结果是*src赋给*dest的值,当*src赋给*dest的值不为'\0'时,进行循环,当*src赋给*dest的值是
       '\0'时,跳出循环。在此需要使用后置++,这样才能保证可以将'\0'拷贝到目标字符串中。*/
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[20] = "abcdef";
    char* arr2 = "abcdef";
    char* s = NULL;
    s = my_strcat(arr1, arr2);
    printf("%s\n", s);
    system("pause");
    return 0;
}

运行结果如下图:
这里写图片描述

我们在实现两个模拟函数时都要注意两点:
1.指针参数需要断言,指针不为NULL。
2.源字符串是不改变的,所以用const修饰,以起到保护作用。

猜你喜欢

转载自blog.csdn.net/windyj809/article/details/80059937