我们知道函数strcpy() 的作用(把一个字符串包括’\0’全复制到另一个字符串上去覆盖),但是现在有个面试官,要求你自己写一个函数,并且该函数的作用与strcpy一模一样.
使用**strcpy()**函数的代码
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]="#################";
char arr2[]="123**";
strcpy(arr1,arr2);
ptintf("%s",arr1);
return 0;
}
面试官要求你的代码:
#include <stdio.h>
void my_strcpy(char arr1[], char arr2[])
{
while (1)
{
if (arr2[i] != '\0')
arr1[i] = arr2[i];
else if (arr2[i] == '\0')
{
arr1[i] = arr2[i];
break;
}
}
}
int main()
{
char arr1[] = "#################";
char arr2[] = "123**";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
好家伙???你以为到这里就结束了吗???真的这么简单吗???用个普通循环你就完毕了???胆子倒是挺大啊
然后面试官会告诉你,如果10分,你只能得到4分,你的程序能力不行…
好吧,你有时间倒流的机会,再回去想个优化,倒计时开始, 3 2 1 0
优化后的代码:
#include <stdio.h>
void my_strcpy(char* arr1, char* arr2)
{
while(*arr2 != '\0')
{
*arr1 = *arr2;
arr2++;
arr1++;
}
*arr1 = *arr2;/*保证'\0'也穿过去*/
}
int main()
{
char arr1[] = "#################";
char arr2[] = "123**";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
嗯?会用指针了?代码能力勉强还行,给你6分,然后问你,小伙子??你还有能力优化你的代码吗?不行的话就要被淘汰了哦…
你心想,mmp,怎么还要优化,然后没办法,绞尽脑汁,终于想到了,时间倒流,
再次优化的代码:
#include <stdio.h>
void my_strcpy(char* arr1, char* arr2)
{
while(*arr2 != '\0')
{
*arr1++ = *arr2++;
}
*arr1 = *arr2;/*保证'\0'也穿过去*/
}
int main()
{
char arr1[] = "#################";
char arr2[] = "123**";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
咦?这个代码设计的挺不错啊?勉强给你7分,嗯,我可以帮你优化下,然后你有没有办法再优化下呢?我的优化是这样的帮你把函数改成这样
void my_strcpy(char* arr1, char* arr2)
{
while(*arr1++ = *arr2++) /*利用'\0'的值为0*/
{
;
}
}
???what??? LZ辛辛苦苦弄成这样,你居然还帮我优化一下,然后问我能不能再优化下啊??我是神仙吗?
嗯…人在屋檐下,不得不低头,心里mmp,脸上还是笑嘻嘻的,优化什么呢?查资料…时间倒流…
设计成这样:
#include <stdio.h>
void my_strcpy(char* arr1, char* arr2)
{
if(arr1 != NULL && arr2 != NULL) /*避免了野指针与传入空指针问题*/
{
while(*arr1++ = *arr2++)
{
;
}
}
}
int main()
{
char arr1[] = "#################";
char arr2[] = "123**";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
嗯…小伙子,我有点喜欢你,这种写法,我给你7.5分,考虑的还是挺不错,嗯…你能优化下你的代码吗?
额…我…心想,这样真的还能优化吗?是不是玩我呢,这么多次优化,一次比一次好,到底还能怎么弄呢?这次之所以设置判断是因为避免空指针,那么下次呢??? 哦~,明白了,虽然这样没太大问题,但是不会提示错误,看不到arr1如果没复制过去是什么原因
来吧 ,时光倒流…
这次的代码:
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* arr1, char* arr2)
{
assert(*arr1 != NULL);
assert(*arr2 != NULL);
while(*arr1++ = *arr2++)
{
;
}
}
int main()
{
char arr1[] = "#################";
char arr2[] = "123**";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
嘿嘿,我使用断言,看你还怎么说
嗯…小伙子,代码能力倒是挺强,这种设计让程序比较强壮,不错不错,我喜欢…,给你8分,但是有个问题,能不能优化一下呢?
什么???还要优化???,都写成这样了,还可以优化吗???我想想…
还能怎么优化呢?刚才都是在避免其他人的错误,是不是还需要避免自己的错误哦,自己?咦?我好像知道了…时间倒流…
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* arr1,const char* arr2) /*防止自己下面写循环的时候写反了,写成*arr2++ = *arr1++*/
{
assert(*arr1 != NULL);
assert(*arr2 != NULL);
while(*arr1++ = *arr2++)
{
;
}
}
int main()
{
char arr1[] = "#################";
char arr2[] = "123**";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
嗯…小伙子,真不错,这个代码我给你9分,完全符合优秀程序员,不过提个建议,你能不能再优化一下,my_strlen呢?如果能,直接录取
好家伙,我数数,你说了几次优化了?6次了…还优化…我再试试…时光倒流…
代码
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* arr1,const char* arr2) /*防止自己下面写循环的时候写反了,写成*arr2++ = *arr1++*/
{
assert(*arr1 != NULL);
assert(*arr2 != NULL);
char* result = arr1;
while(*arr1++ = *arr2++)
{
;
}
return result; /*直接返回arr1地址*/
}
int main()
{
char arr1[] = "#################";
char arr2[] = "123**";
printf("%s", my_strcpy(arr1, arr2));/*进行链式访问,减少了引起变量*/
return 0;
}
嗯??? 指针,断言,他人错误考虑,自己错误考虑,链式访问…我去,捡到宝了,这个程序10分啊,小伙子,快来快来…不用面试了,直接工作吧…
致此,终于告一段落…成功了