模拟实现库函数strcpy的四种方法(逐个优化)

1.首先,我们要明确strcpy的用法及工作原理,如下:

#include

#include(strcpy需要引的头文件)

int main()

{ char arr1[] = "#############";

char arr2[] = "bit";

strcpy(arr1,arr2) ; (strcpy (目的地,源头))

printf("%s\n",arr1);

return 0;

}

此段代码的输出结果为bit。因为字符串的结束标志为‘\0’,所以字符串arr1的内容其实为”#########\0",字符串arr2的内容为"bit\0",strcpy函数的本质就是将源头的值输送给目的地的值,遇到\0则停止。所以打印出arr1的结果是“bit”。

2.模拟实现strcpy函数

方法1:

#include

void my_strcpy(char*dest,char*sur) (地址要用指针来接收)

{

while( *sur != '\0')

{

*dest = *sur;

dest++;

sur++;

}

*dest = *sur

}

int main()

{

char arr1[] = "##########";

char arr2[] = "bit";

my_strcpy(arr1,arr2); (数组传参实际上传过去的是数组首元素地址)

printf("%s\n,arr1);

return 0;

}

如果满分给十分,那么方法1只能拿到6分,代码形式较挫且不能发现bug

方法2:

#include

void my_strcpy(char*dest,char*sur)

{

while( *dest++ = *sur++) (*dest与*sur在没遇到\0之前都为真,所以while可以运行,每运行一次,后置++就使dest与str指针指向下一个元素,直到遇到\0)

{ ;

}

*dest = *sur

}

int main()

{

char arr1[] = "##########";

char arr2[] = "bit";

my_strcpy(arr1,arr2);

printf("%s\n",arr1);

return 0;

}

方法2只能得到7分,当将arr1或者arr2其中一个改为空指针NULL时,系统就会自动崩溃,无法自动发现bug,例如:

#include

void my_strcpy(char*dest,char*sur)

{

while( *dest++ = *sur++)

{ ;

}

*dest = *sur

}

int main()

{

char arr1[] = "##########";

char arr2[] = "bit";

my_strcpy(arr1,NULL);

printf("%s\n",arr1);

return 0;

}

此代码也有优化方法,如下:

#include

void my_strcpy(char*dest,char*sur)

{

if(dest != NULL && sur !=NULL)

{

while( *dest++ = *sur++)

{ ;

}

}

*dest = *sur

}

int main()

{

char arr1[] = "##########";

char arr2[] = "bit";

my_strcpy(arr1,NULL);

printf("%s\n",arr1);

return 0;

}

此代码虽然可以正常运行,但并不能解决问题,而是将问题跳过)

因此只能得7分

方法3:

此方法要用到的函数assert()->断言函数,头文件为(#include

用法如下:

#include

#include

void my_strcpy(char*dest,char*sur)

{

assert(dest != NULL);(断言) ()中结果若为真,则什么都不发生,若为假,则系统报错

assert(sur != NULL);(断言)

while( *dest++ = *sur++)

{ ;

}

}

int main()

{

char arr1[] = "##########";

char arr2[] = "bit";

my_strcpy(arr1,NULL);

printf("%s\n",arr1);

return 0;

}

assert()的引入让系统可以自动发现问题并报错,而不是跳过问题;(8分)

方法4:

此方法需要引入const用以修饰指针

const修饰的作用,如下:

假如 int a = 10;

int *p = &a;

*p = 20;

此段代码是将a的地址放入指针中,通过对指针的解引用来改变a的值。

但如果使用const后有以下几种情况:

1.const加在*的左边

int a = 10;

const int*p = &a

*p = 20

运行可发现此段代码是错误的,原因:

const限定了一个变量无法被改变,因此加在*号左边时,实际上const对*p产生了作用,因此*p无法被改变,代码错误。

  1. const加在*右边

int a = 10;

int * const p = &a

*p = 20;

运行可发现此段代码可正常运行,a的结果被改为20,原因是const放在*的右边,对p产生了作用,因此对*p并无影响。但无法改变p的值

方法4如下:

#include

#include

char * my_strcpy(char*dest, const char*sur) (源头的数据一定不会被修改,为了保护源头的数据,因此加上const)(strcyp函数实际返回值是目的地的那个值)

{

char* = ret;(因为后面程序运行以后,目的地的地址已经不是刚开始的时候的地址了,因此在开始创建一个变量接收目的地的起始地址,后面再返回)

assert(dest != NULL);

assert(sur != NULL);

while( *dest++ = *sur++)

{ ;

}

return ret;(返回起始地址)

}

int main()

{

char arr1[] = "##########";

char arr2[] = "bit";

my_strcpy(arr1,NULL);

printf("%s\n",arr1);

return 0;

}

10分)const和char*各一分。

你可能感兴趣的:(c#)