废话不多说,看代码:
普通写法
#include<stdio.h>
void my_strcpy(char* dest, char* src)
{
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;
}
int main()
{
char arr1[] = "#############";
char arr2[] = "hello";
//strcpy(arr1, arr2);//后者内容被拷贝到前者
my_strcpy(arr1, arr2);
printf("%s\n", arr1);//hello
return 0;
改善
#include<stdio.h>
void my_strcpy(char* dest, char* src)
{
while (*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[] = "#############";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);//hello
return 0;
}
此写法仍有一定问题,如果函数参数中拷贝的源头为无效空指针my_strcpy(arr1, NULL);无法识别出来。
再改善
#include<stdio.h>
void my_strcpy(char* dest, char* src)
{
if (*dest != NULL && *src != NULL)
{
while (*dest++ = *src++)
{
;
}
}
}
int main()
{
char arr1[] = "#############";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);//hello
return 0;
}
此写法只是规避了问题,不利于发现问题。
再再改善
#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest, char* src)
{
assert(dest != NULL);//断言 - 有问题会报错,保证指针有效性
assert(src != NULL);//断言
if (*dest != NULL && *src != NULL)
{
while (*dest++ = *src++)
{
;
}
}
}
int main()
{
char arr1[] = "#############";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);//hello
return 0;
}
此写法仍不够完善,一定情况下拷贝的源头与目的地写反仍可正常运行无法发现。
再再再改善
#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest,const char* src)//const使拷贝源头不能改变,写反会报错
{
assert(dest != NULL);
assert(src != NULL);
if (*dest != NULL && *src != NULL)
{
while (*dest++ = *src++)
{
;
}
}
}
int main()
{
char arr1[] = "#############";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);//hello
return 0;
}
当我们查看strcpy资料会发现函数strcpy 的原型:
char *strcpy(char *strDest,const char *strSrc);
strcpy为char*类型,是有返回值的,这样并非多此一举,增加了灵活性,可以生成链式表达式。
再再再再改善
#include<assert.h>
char* my_strcpy(char* dest, const char* src)//const使拷贝源头不能改变,写反会报错
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
if (*dest != NULL && *src != NULL)
{
while (*dest++ = *src++)
{
;
}
}
return ret;
}
int main()
{
char arr1[] = "#############";
char arr2[] = "hello";
printf("%s\n", my_strcpy(arr1, arr2));//hello 链式访问 - 函数返回值做另一个函数的参数
return 0;
}
至此,我们才得到了满分答案,由此可见,看起来简简单单的一个问题,可能实际要操作完美并没有那么简单。