zoukankan      html  css  js  c++  java
  • 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则是程序员慢慢调试.库函数则是以效率为先!

  • 相关阅读:
    计算机基础
    POJO(PO)与javaBean的比较、以及DTO的说明
    Spring Assert(方法入参检测工具类-断言)
    Extjs tree的相关方法及配置项
    spring aop两种配置方式(1)
    Oracle存储过程中临时表的使用技巧
    文件上传
    java中的IO操作总结
    ExtJs文件上传(Ext.ux.form.FileUploadField)
    Extjs 属性控件[转载]
  • 原文地址:https://www.cnblogs.com/brillliu/p/3548866.html
Copyright © 2011-2022 走看看