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!好好总结一下:
一、第一个版本,这也是网上最常见的写法:
上面的写法一般情况下不会有什么问题,但如果strSrc所指的字符串的长度大于等于strDest的字符串长度时,问题就出来了!/// //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; }
。。。。。。。。。。待续,吃个饭先!!!