免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1204 | 回复: 2
打印 上一主题 下一主题

[函数] 几个库函数分析疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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) 的 情况呢?

另外 不知怎么才能得到更多的库函数的源代码?到那去找那?

论坛徽章:
0
2 [报告]
发表于 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 ;
复制代码

论坛徽章:
0
3 [报告]
发表于 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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP