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吧!!!

得到两个道理:

一、看源代码有时候很有用

二、国企笔试题很简单(不一定啊)

三、(超了,算了,就两条吧)



0 0
原创粉丝点击