我是靠谱客的博主 甜美小馒头,最近开发中收集的这篇文章主要介绍假设你有时间倒流能力,你会选择怎样做这个面试题??考验你的代码能力,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我们知道函数strcpy() 的作用(把一个字符串包括’’全复制到另一个字符串上去覆盖),但是现在有个面试官,要求你自己写一个函数,并且该函数的作用与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] != '')
			arr1[i] = arr2[i];
		else if (arr2[i] == '')
		{
			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 != '')
    {
        *arr1 = *arr2;
        arr2++;
        arr1++;
    }
    *arr1 = *arr2;/*保证''也穿过去*/
}
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 != '')
    {
        *arr1++ = *arr2++;
    }
    *arr1 = *arr2;/*保证''也穿过去*/
}
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*/
    {
        ;
    }
}
???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分啊,小伙子,快来快来…不用面试了,直接工作吧…

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

最后

以上就是甜美小馒头为你收集整理的假设你有时间倒流能力,你会选择怎样做这个面试题??考验你的代码能力的全部内容,希望文章能够帮你解决假设你有时间倒流能力,你会选择怎样做这个面试题??考验你的代码能力所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部