zoukankan      html  css  js  c++  java
  • strlen、strcpy和strcmp源码

    1不使用库函数实现strcpy

    #include <assert.h>

    char *strcpy(char *dst, const char *src)

    {         

       assert((dst != NULL) && (src != NULL));        

       char *tmp = dst;        

       while ((*dst++ = *src++) != '') 

      {                 /* nothing */;        

       }         

      return tmp;

    }

    需要注意几个方面的问题:

    1、注意编程风格。比如,使用dstsrc这样增强可读性的名字。

    2、使用断言assert来检验输入参数的有效性。

         assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回false,则终止程序执行。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁

         用断言。

    3、使用const来约束src,表明src对应的内容不能被修改。

    4、返回dst,以便实现链式表达式这样的机制。

    2strlen函数源码

    size_t strlen_b(const char * str) 

    {

         const char *cp =  str;

         while (*cp++ );

         return (cp - str - 1 );

     

    3、微软strcmp函数源码

    int __cdecl strcmp (const char *src, const char *dst)

    {   

      int ret = 0 ;   

      while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)   

      {   

        ++src;   ++dst;  

      }   

      if ( ret < 0 )   

      ret = -1 ;   

      else if ( ret > 0 )   

      ret = 1 ;   

      return( ret );

    }

     

    4、面试中strcpy源码的判分标准

    如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:

      2

    void strcpy( char *strDest, char *strSrc )   {   while( (*strDest++ = * strSrc++) != ‘’ );   }

      4分 

     void strcpy( char *strDest, const char *strSrc )   //将源字符串加const,表明其为输入参数,加2   {   while( (*strDest++ = * strSrc++) != ‘’ );   }

      7分 

    void strcpy(char *strDest, const char *strSrc)   {   //对源地址和目的地址加非0断言,加3   assert( (strDest != NULL) &&(strSrc != NULL) );   while( (*strDest++ = * strSrc++) != ‘’ );   }

      10分 

    //为了实现链式操作,将目的地址返回,加3!   char * strcpy( char *strDest, const char *strSrc )   {   assert( (strDest != NULL) &&(strSrc != NULL) );   char *address = strDest;   while( (*strDest++ = * strSrc++) != ‘’ );   return address;   }

      从2分到10分的几个答案我们可以清楚的看到,需要多么扎实的基本功才能写一个完美的strcpy。 

    5strlen的掌握,它没有包括字符串末尾的''

      看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为: 

     int strlen( const char *str ) //输入参数const2

    {     assert( strt != NULL ); //断言字符串地址非03     int len;     while( (*str++) != '' ) // 3     {         len++;     }     return len;  }

  • 相关阅读:
    Java入门:基础算法之从字符串中找到重复的字符
    Java入门:基础算法之产生随机数
    Java入门:基础算法之线性搜索
    Java入门:基础算法之检查奇偶性
    安装hadoop1.2.1集群环境
    Linux上安装JDK
    改变HTML中超链接的显示样式
    【Nutch2.2.1源代码分析之5】索引的基本流程
    【Nutch2.2.1源代码分析之4】Nutch加载配置文件的方法
    java生成UUID通用唯一识别码 (Universally Unique Identifier)
  • 原文地址:https://www.cnblogs.com/xuhj001/p/3428088.html
Copyright © 2011-2022 走看看