Chinaunix

标题: 几个库函数分析疑惑 [打印本页]

作者: 陶深    时间: 2003-04-28 08:59
标题: 几个库函数分析疑惑
诸如strlen(),strcmp()等字符处理函数是经常用到的。对它们源码的分析 可以很大的提高自己的编程水平。我在分析这些函数时遇到了几个不明白的地方,想和大家讨论一下。

1。 int strlen( const char   string )   //计算字符串的长度
      {
              int i = 0;
              while(string) i++;
               
               return i ;
         }
      Q: 参数string明明是个 char ,但在while 中 为什么就成了数组string)了 (我推断: 也许函数中的参数忘写了 指针符号 *,但我没有找到别的出处来校对)?  

2. int streql( char* str1, char* str2)  //判断两个字符串是否相等
   {
          while((*str1==*str2)&&(*str1))
           {
                  str1++;
            str2++   ;
            }
           return ( (*str1 ==NULL)&&(*str2 ==NULL) )
      }
  
      Q: 返回语句(return)中的 表达是式怎么解释?
3。 int strcmp(const char* str1, const char* str2)//判断俩个串大小
{
         while ((*str1 == *str2)&&(*str1))
          {
                 str1++;
                 str2++;
           }
          if ((*str1 ==*str2)&&(!*str1)) //same strings
               return 0;
          else if ((*str1 )&&(! * str2))  // same but str1 longer
               return - 1;
          else if ((*str2)&&(!* str1))   // same but str2 longer
          else
          return ((*str1>;*str2)?-1:1);

         }
Q:
     串1str1和串2str2比校大小(return(*str1 >;*str2))不能理解。为什么要靠指针的值去比较串的大小呢? 而且两个串相等后,怎么还会出现str1 longer ( or str2 longer) 的 情况呢?

另外 不知怎么才能得到更多的库函数的源代码?到那去找那?
作者: 无双    时间: 2003-04-28 13:22
标题: 几个库函数分析疑惑
可以找glibc源码看

另外1我觉得是忘记写8了,可能是你得到的代码不对
你是从哪里得到的?

2( (*str1 ==NULL)&&(*str2 ==NULL) )
这是一个bool表达式
就像是

  1. if(( (*str1 ==NULL)&&(*str2 ==NULL) )
  2. )
  3. return true;
  4. else return false;
复制代码

功能一样

3
建议你先理解一下这个函数的功能及返回值
0 = 》 1  《-1
必须保证完成这个功能
然后就可以理解了
看函数应该了解需求(功能)
不要受制于代码

((*str1>;*str2)?-1:1); 这个是? :表达式,你应该也能理解吧
就是i
  1. f((*str1>;*str2)
  2.      return -1:
  3. else return ;
复制代码

作者: 陶深    时间: 2003-04-29 09:05
标题: 几个库函数分析疑惑
谢谢斑竹

我这再帖出strcmp()的两种写法,希望各位同仁能从中收益。

int strcmp(const char* str1, const char* str2)
{
    while ((*str1 == *str2)&&(*str1))
    {
       str1++;
       str2++;
     }

    if ((*str1 ==*str2)&&(!*str1)) //same strings
          return 0;
    else if ((*str1 )&&(! * str2)) // same but str1 longer
          return - 1;
    else if ((*str2)&&(!* str1)) // same but str2 longer
          else
   
    return ((*str1>;*str2)?-1:1);

   
}


int strcmp(const char * cs,const char * ct)
{
        register signed char __res;

        while (1) {
                if ((__res = *cs - *ct++) != 0 || !*cs++)
                        break;
        }

        return __res;
}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2