• C语言strcpy函数实现.


    看面试题的时候有个题目是不使用库函数,实现strcpy函数.(字符串拷贝函数)

    这个是我写的代码,在机器上编译过了.

    void my_strcpy(char *t,char *s){
        while((*t++=*s++));
    }

    看了很多帖子,发现我这个代码的问题还是很多的.即使这么简单的一个小程序也有很多的东西需要考虑.下面总结:

    1.关于函数返回值.我写的是void,即函数不返回参数.所以我这个函数的唯一目的是将s地址字符串复制到t上.不返回任何信息.这样写的代码在以后使用是不方便的.林锐<高质量C/C++编程指南>里提到:返回char *的目的是为了实现链式表达式.如:

            

    int length=strlen(strcpy(strDest,"HelloWorld"));//如果没有返回char *那么要多写几行代码非常麻烦.

    2.保留原串的问题.

      正因第一个错误犯下导致了第二个错误的直接产生,那就是保留目标串首地址的问题.既然要返回目标串的话肯定是返回目标串的首地址.即return t.而在函数里对t要进行地址移动操作,所以在开始要保存t的地址.

    char *strDest=t;    //t的地址保留在strDest,这样直接返回strDest即可,而可以操作t.

    3.关于源串,目标串的检查问题.

      这个主要是检查源串,目标串指针的合法性.

    assert((t!=NULL) && (s!=NULL)); //如果t,s均!=NULL那么就继续执行,如果不是的话并退出程序并输出错误信息.

    这样一来,比较合格的strcpy()函数完成:(这个也是林锐博士在高质量C/C++编程当中的源代码)

    char *my_strcpy(char *t,char *s){
        char *strDest=t;
        assert((*t)!=NULL && (*s)!=NULL);
        while((*t++=*s++));
        return strDest;
    }

    其实在GNU C的strcpy源代码当中并没有对串指针合法性的检测.看了网上帖子大家争论的原因是:assert()这个函数非常的繁琐耗时.所以GNU C是为了提高效率,而且本意是如果出错则程序会crash,而检查crash则是程序员慢慢调试.库函数则是以效率为先!

  • 相关阅读:
    Linux下修改Apache即httpd的端口
    jenkins.JenkinsException: Error in request. Possibly authentication failed
    jenkins-python 获取正在运行的Job
    通过python-jenkins 获取job的输出日志
    电子公文传输系统团队项目
    接口重复请求报错问题排查
    创建couchbase的bucket 提示RAM不够用 all the ram in the cluster is already allocated to existing bucekets,delete some buckets,,
    tornado重定向的几种方式
    tornado进行登录案例
    tornado设置cookie和查看cookie,含加密
  • 原文地址:https://www.cnblogs.com/brillliu/p/3548866.html
Copyright © 2020-2023  润新知