假设你有时间倒流能力,你会选择怎样做这个面试题??考验你的代码能力

我们知道函数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分啊,小伙子,快来快来…不用面试了,直接工作吧…

致此,终于告一段落…成功了

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捕获一只小肚皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值