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修饰,以起到保护作用。