strcpy学习心得
来源:互联网 发布:编程有多难 编辑:程序博客网 时间:2024/06/15 11:45
前几天去参加北京某国企的笔试,遇到一个strcpy的找错题,由于本人平时没怎么研究strcpy这个函数,也没有看面试宝典之类的书籍,做到这个题的时候有点蒙的感觉,同时又有点可惜,知道这样的题目算是非常简单的了,自己不会是脑袋坏掉了,回来后实在是气不过,决心要把strcpy搞定。废话少说先把题目给大家看看:
找错题:试题1:void test1(){ char string[10]; char* str1 = "0123456789"; strcpy(string,str1);}试题2:void test2(){ char string[10],str1[10]; int i; for(i=0;i<10;i++) { str1[i] = 'a'; } strcpy(string,str1);}试题3:void test3(char* str1){ char string[10]; if (strlen(str1) <=10) { strcpy(string,str1); }}试题4:void swap(int* p1,int* p2){ int *p; *p = *p1; *p1 = *p2; *p2 = *p;}
如果你没有看出错误那就和我一样危险了,赶紧往下看吧,如果你都看出了错误,还是继续往下看吧,可能会有新的收获啊。我当时回来后没有去百度没有去翻阅参考书,直接打开VS2008,在里面输入strcpy();然后点Go按钮,就看到strcpy的源代码了,让我震惊的是strcpy的代码居然这么简单,难怪会有错误呢,都是偷懒惹的祸啊!!!
// strcpy的源代码char * __cdecl strcpy(char * dst, const char * src){ char * cp = dst; while( *cp++ = *src++ ) ; /* Copy src over dst */ return( dst );}
代码是不是超简单,没有越界保护,没有参数保护,真是个危险的函数,好了,在对比源代码后,上面几个改错题就可以迎刃而解了。
试题1:
char* str1="0123456789";中的字符串是存储在静态存储区的,也就是常量区了,在字符串的后面会有默认的\0的,这样当strcpy在执行while( *cp++= *src++ )的时候遇到\0程序就会停止,但是*cp++ = *src++已经执行了,也就是cp[11]已经被赋值了,也就是数组赋值越界,在函数执行完毕回收栈的时候一定会发生错误的。所以正确的程序是只要charstring[10];中数组的长度至少比字符串的长度大1就行了。
试题二:
strcpy(string,str1);中的参数二str1是个数组指针,由于数组中存储的全是‘a’,这样while( *cp++= *src++ )访问到str1最后一个元素的时候也不会停止,程序会继续执行下去,访问越界。
试题三:如果char* str1="0123456789";strlen(str1)正好是10;这样错误和试题一是一样的,如果char str1[10]; 这样和试题二中的错是一样的。
试题四:其实试题四不是考察strcpy的,先不管这些,反正这个题不会也是要丢分的,也是会被鄙视的,也是找不到工作的,好怕啊,那就好好看吧,试题四中考察指针的使用和函数参数的按地址传递,传址就先不说了,很明显 int *p; *p = *p1;int *p = new int;指针p没有初始化就赋值了,也就是给野指针赋值了,要多可怕有多可怕,程序改成
int *p =newint;,给p初始化就好了。
是不是感觉直接看源代码很有帮助呢?那必须的,搞懂源代码就可以以不变应万变了,小试牛刀一下吧,刚才好像还有个strlen( )函数,就拿它开刀了,同样的方法,在VS2008中输入strlen(),点Go按钮就看到strlen的源代码了:
//strlen( )源代码size_t __cdecl strlen ( const char * str ){ const char *eos = str; while( *eos++ ) ; return( eos - str - 1 );}
同样没有参数保护,同样没有越界保护,和strcpy是一个人写的吧,看看while( *eos++) ;就知道什么时候会出错了,很Easy吧!!!
得到两个道理:
一、看源代码有时候很有用
二、国企笔试题很简单(不一定啊)
三、(超了,算了,就两条吧)
- strcpy学习心得
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- strcpy
- Linux设备驱动剖析之SPI(三)
- cf target http://api.192.168.1.134.xip.io 失败
- 理解CSS3线性渐变
- Windows 7 专业版/家庭版 装(中文)语言包
- Wowza 服务器打不开
- strcpy学习心得
- 网页如何实现平均分成左右两部分
- 使用GUI反编译需要手动修改的地方
- 排序(一)
- Putty之public key ssh认证入门
- Socket同时使用ObjectInputStream和ObjectOutputStream传输序列化对象时的顺序
- POJ 2891 Strange Way to Express Integers 中国剩余定理解法
- 巧夺天工的kfifo
- 第二次实验-----算法基本功与综合思考