• 关于strcpy()函数


    刚参加武汉烽火的笔试回来,其中一题要实现strcpy()函数,如果没猜错,应该是从林锐的《高质量C_C++编程》中借鉴,随手写了:
    char * strcpy(char * desc,char * src)
    {
        char *p;
        if(src == NULL) exit(0);
        if(desc == src) return desc;
        p = desc;
        while( *src == '\0')
            *desc++ = *src++;
        return p;
    }

    林锐的答案:
     

    char *strcpy(char *strDest, const char *strSrc);

    {

        assert((strDest!=NULL) && (strSrc !=NULL)); // 2

        char *address = strDest;                   // 2

        while( (*strDest++ = * strSrc++) != \0 )    // 2

           NULL ;

        return address ;                          // 2

    }

    恰好昨天在CSDN上看到一个帖子讨论strcpy(); 
    对其中相关的内容做了一点解释:
    void test1()
    {
    int i;
    char string[10];
    char *str1="0123456789";
    strcpy(string, str1); // 字符越界?
    /*
    错误:
    strcpy(desc,src),
    当src<=desc时, 如 char *str1="012345678",长度为10,
    则string得到合理值,并且string[9]='\0';
    当src>desc时,如  char *str1="0123456789",长度为11,
    则string得到0-9的值,string[9]='9',
    虽然可以运行,但string[9]后面的一个不属于string的字符
    被恶意修改为‘\0',这不是我们想要的,也可能造成严重后果。
    */
    printf("%s\n",string);
    for(i=0;i<11;i++)//故意循环11次,查看最后一个被无意修改的字节;
    {
        printf("%c\t%d\n",string[i],string[i]);
    }
    printf("\n");
    }

    void test2()
    {
    int i;
    char string[100], str1[10];
    for(i=0; i<10;i++)
    {
    str1[i] ='a';
    }
    strcpy(string, str1);
    /*
    strcpy(desc,src)
    会把src 视为string类型,拷贝时查找'\0'结束符,作为scr的结束,来付给desc;
    所以,本程序虽然能够运行,但潜在的问题:
    str1的所有10个元素被初始化为'a',但后续的字符是不可预料的,
    直到”偶然“碰到了'\0',才停止识别str1;
    如果string是个100个元素的大数组,则会发现str1后面的"随机元素"也被复制给了string
    直到碰到'\0'
    说"偶然",加引号,其实'\0'在未知内存中还是挺多的。呵呵
    当然,如果desc是string[10]的话,也就会掐掉str1后面的东东,这就是表面上的运行正确;
    */
    printf("%s\n",string);
    for(i=0;i<100;i++)
    {
        printf("%c\t%d\t%c\n",string[i],string[i],str1[i]);//对比来看;
    }
    printf("\n");
    }

  • 相关阅读:
    【CFD之道】2018年原创文章汇总
    【OpenFOAM案例】03 Docker安装OpenFOAM
    【OpenFOAM案例】02 自己动手
    【OpenFOAM案例】01 elbow
    Fluent动网格【13】:网格光顺总结及实例
    Fluent动网格【12】:扩散光顺
    Fluent动网格【10】:区域运动案例
    Fluent动网格【11】:弹簧光顺
    happyChat开发系列:使用websocket.io实现双向通信的乐聊大前端开发
    vue,vuex的后台管理项目架子structure-admin,后端服务nodejs
  • 原文地址:https://www.cnblogs.com/kevin/p/68309.html
Copyright © 2020-2023  润新知