飞奔的炮台 发表于 2021-12-26 10:54:35

模拟实现strcpy()函数

字符串拷贝,遇到'\0'停止。
strcpy()函数原型:
#include<stdio.h>
int main()
{
char arr1[] = "###############";
char arr2[] = "bit";
       strcpy(arr1, arr2);
       printf("%s\n", arr1);
       return 0;
}
//看我怎么模拟实现这个功能的哈;
Code1(2分)
#include<stdio.h>
void my_strcpy(char* dest,char* src)
{
while(*src!='\0')
{
*dest=*src;
src++;
dest++;
}
*dest=*str;//'\0';//没忘记<string.h>里的兄弟们跟'\0'的恩恩怨怨,+1;
}
int main()
{
char arr1[]="################";
char arr2[]="bit";
my_strcpy(arr1,arr2);//套用函数,+1分;
printf("%s\n".arr1);
return 0;
}
​//身为面试题,这个代码太挫了,到家了,
//优化一下:
Code2(4分)
#include<stdio.h>
void my_strcpy(char* dest,char* src)
{
while(*src)//逻辑转换,节省了空间,+1分;
{
*dest++=*src++;//巧用后置自增的特性,+1分;
}
*dest=*src;
}
int main()
{
char arr1[]="##############";
char arr2[]="bit";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
​//这个代码也太辣鸡,连字符串和'\0'都要分开写;
//优化一下:
Code3(6分)
#include<stdio.h>
void my_strcpy(char* arr1,char* arr2)
{
while(*dest++=*src++)//避免了字符串与'\0'分开写,+1分;
{
;//不可缺失,+1分;
}
}
int main()
{
char arr1[]="##############";
char arr2[]="bit";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
​//优化的力度还是太小了,万一出现空指针怎么办,
//优化一下:
Code4(7分)​
#include<stdio.h>
void my_strcpy(char* dest, char* src)
{
if(dest!=NULL&&src!=NULL)//防止传参有空指针,为了指针的有效性,+1;
{
while(*dest++=*src++)
{
;
}
}
}
int main()
{
char arr1[] = "###############";
      char arr2[] = "bit";
      my_strcpy(arr1, arr2);
      printf("%s\n", arr1);3
return 0;
}
​这个思维考虑了万一空指针怎么办,但是还不够,去MSDN看一下定义吧
优化一下:
Code5(8分)
#include<stdio.h>
#include<assert.h>
voidmy_strcpy(char* dest, char* src)
{
assert(dest != NULL);//断言-发现空指针会报错-比if高级吧哈哈;
assert(src !=NULL);//使用了库函数,+1;
//把src指向的字符串拷贝到dest指向的空间,包含'\0'字符;
while(*dest++=*src++)
{
;
}
}
int main()
{
      char arr1[] = "###############";
      char arr2[] = "bit";
      my_strcpy(arr1, arr2);
      printf("%s\n", arr1);3
return 0;
}
​//查看定义发现,
//char *strcpy( char *strDestination, const char *strSource );
//老规矩,优化一下:
Code6(10分)
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src)//const使得src成为常量指针,不会被赋值,若是卸载了左侧会报错提醒,+0.5分;
{
char* ret =dest;//将目的地的起始地址存起来用来最后返回,因为返回++后的地址毫无意义,返回去也找不到,点睛之笔+1分;
assert(*dest!=NULL);//括号内成立则nothing;
assert(*src!=NULL);
while(*dest++=*src++)
{
;
}
//strcpy()函数原型是有char*返回值,所以,这里返回;
return ret;
}
int main()
{
      char arr1[] = "###############";
      char arr2[] = "bit";
      printf("%s\n", my_strcpy(arr1, arr2));//将一个函数返回值当作另一个函数的参数-链式访问,+0.5分;
return 0;
}
//低调,低调,不要鼓掌!!


https://blog.51cto.com/u_15468432/4843808
页: [1]
查看完整版本: 模拟实现strcpy()函数