JDSU面试归来小结----strcpy这个函数实现问题。

    2012年4月初,去了一下JDSU面试,三个面试官“群殴”,面试流程还是那些,首先简单自我介绍一下,说了一下自己的名字,毕业学校,家乡,开始工作的时间,工作的内容,及这次换工作的原因,轻松搞定,

然后拿着我的简历边看边让我介绍一下上面做过的项目,大概说了一下,毕竟是工作中确确实实做过的东西,所以也轻松搞定!

接下来就是开始一些技术问题:

1.数组和指针的区别

2.linux中的调试工具用过哪些?gdb调试工具break的用法?

。。。

可以在白板上实现一下strcpy函数吗?


然后屁颠屁颠就去上去一边演示一边实现,也不怎么紧张,比竟在HW的时候这个是家常便饭,可不知道为什么这个看了n次函数的实现,上去一提笔就有点头晕了,对于出现这种情况,大家可以尽情地鄙视我:

       提笔就写出这样的代码,大家一看就知道当时肯定是头脑非常地不清醒:

char* strcpy(const char *strDest,const char *strSrc)
{
	if (strSrc == NULL)
	{
		return NULL;
	}

	for (;*strSrc != '\0';)
	{
		*strDest++ = *strSrc++;
	}

	return strDest;
}

上面明显有好几个错误,后面再慢慢说明,当时写完之后,心里也知道这是有问题的,但头脑不知道怎么地,也不想去改了,算了,估计这次面试就此Over了,不过没事,就当练手,回家好好总结一下,下次不要再犯一样的错误就是了!

那三个考官看完后,有一个就问还要不要再想一想,我说不用了,今天状态不佳!然后帮我指出了上面的两个问题:

一个是第一个入参为什么是const,后面的

	*strDest++ = *strSrc++;
   strDest是的const类型的,能做为左值?   自己一想,啊,崩溃了。。。问题很严重?

    第二个问题就是如果strSrc所指的字符串长度比strDest指针所指向的内存长度大,会出现什么情况?

    到此,意识到问题的严重性了,这么个简单的字符串拷贝地函数,竟然今天会败在它手里!NND!好好总结一下:

一、第一个版本,这也是网上最常见的写法:
///
//strcpy函数的实现 
//把src所指由NULL结束的字符串复制到dest所指的数组中。
//src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
//返回指向dest的指针。
//

//返回一个char *类型的指针
//第一个参数:strDest为目标字符串,这个是要改变其内容的,需要修改,不能加const修饰
//第二从参数:strSrc为源字符串,不可修改,加const修饰增强程序的健壮性
char *_strcpy(char *strDest, const char *strSrc)
{
	const char *p;
	char *q; 
	
	for(p = strSrc, q = strDest; *p != '\0'; p++, q++)
		*q = *p;
	
	*q = '\0';
	
	return strDest;
}
上面的写法一般情况下不会有什么问题,但如果strSrc所指的字符串的长度大于等于strDest的字符串长度时,问题就出来了!



。。。。。。。。。。待续,吃个饭先!!!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值