zoukankan      html  css  js  c++  java
  • GNU LIBC源代码学习之strcmp

    比較两个字符串

    我的代码块

    #include <string.h>
    
    
    int my_strcmp(const char* s1,const char * s2)
    {
     if((s1==NULL)||(s2==NULL))
      return 0;
     while(1)
     {
      if((*s1=='')||(*s2==''))
       break;
      if(*s1>*s2)
       return 1;
      if(*s1<*s2)
       return -1;
      s1++;
      s2++;
     }
     //if(*s1==*s2=='')
     // return 0;
     if(*s1==''&&*s2=='')
      return 0;
     if(*s1>*s2)
      return 1;
     else
      return -1;
    
    }
    
    int main()
    {
     char* a="abcdef";
     char* b="abcdef";
     my_strcmp(a,b);
     return 0;
    }

    这里,上面的方法。不可靠,没有明白的内在逻辑。
    看看源代码

    /* Copyright (C) 1991-2015 Free Software Foundation, Inc.
       This file is part of the GNU C Library.
    
       The GNU C Library is free software; you can redistribute it and/or
       modify it under the terms of the GNU Lesser General Public
       License as published by the Free Software Foundation; either
       version 2.1 of the License, or (at your option) any later version.
    
       The GNU C Library is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       Lesser General Public License for more details.
    
       You should have received a copy of the GNU Lesser General Public
       License along with the GNU C Library; if not, see
       <http://www.gnu.org/licenses/>.  */
    
    #include <string.h>
    
    #undef strcmp
    
    /* Compare S1 and S2, returning less than, equal to or
       greater than zero if S1 is lexicographically less than,
       equal to or greater than S2.  */
    int
    strcmp (const char *p1, const char *p2)
    {
      const unsigned char *s1 = (const unsigned char *) p1;
      const unsigned char *s2 = (const unsigned char *) p2;
      unsigned char c1, c2;
    
      do
        {
          c1 = (unsigned char) *s1++;
          c2 = (unsigned char) *s2++;
          if (c1 == '')
    return c1 - c2;
        }
      while (c1 == c2);
    
      return c1 - c2;
    }

    要比較s1和s2的每个字节的大小,则,两者比較,最简单的分类就是相等和不相等,在相等的时候继续,不相等时。马上计算返回。

    至于
    const unsigned char s1 = (const unsigned char ) p1;
    const unsigned char s2 = (const unsigned char ) p2;
    这样转换的妙处,未能体会

  • 相关阅读:
    java中Calendar类里面的月份是月份数减一。
    hdu oj
    存在重复元素
    杨辉三角
    删除链表的倒数第n个结点
    相交链表
    环形链表 II
    环形链表
    至少是其他数字两倍的最大数
    寻找数组的中心索引
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5340656.html
Copyright © 2011-2022 走看看