c库常用函数源码分析

c库函数源码解析方法

c语言学习过程中,会使用到许多库函数,典型的字符串处理函数的实现在许多公司笔试题中都会有考,所以掌握这一块不经可以增强个人c语言语法知识,对找工作也会有一定的益处。
如何查看c库函数源码呢?
下载gnu libc库,下载地址:http://www.gnu.org/software/libc/
下载完成可直接使用代码阅读工具查看代码,比如windows source insight;ubuntu vim+ctags即可

下面介绍源码strstr和个人实现函数接口(仅供参考)
1.strstr库函数源码

char *
DEFUN(strstr, (haystack, needle),
      CONST char *CONST haystack AND
      CONST char *CONST needle)
{
  //查找子串末尾地址
  register CONST char *CONST needle_end = strchr(needle, '\0');
  
  //被查找子串末尾地址
  register CONST char *CONST haystack_end = strchr(haystack, '\0');
  
  //查找子串长度
  register CONST size_t needle_len = needle_end - needle;
  
  //实现原理字符串从查找子串尾到头比较,提供被查找开始地址使用
  register CONST size_t needle_last = needle_len - 1;
  
  //定义被查找子串开始地址
  register CONST char *begin;
  
  //判断查找子串为0或者查找子串比被查找子串短,直接返回
  if (needle_len == 0)
    return (char *) haystack;	/* ANSI 4.11.5.7, line 25.  */
  if ((size_t) (haystack_end - haystack) < needle_len)
    return NULL;
    
  //开始比较,比较方式从被查找子串最后一个字符向前比较,注意被查找子串的开始地址,比较有差异,增加被查找地址在逐个字符从后向前比较
  for (begin = &haystack[needle_last]; begin < haystack_end; ++begin)
    {
      //查找子串的最后一个字符
      register CONST char *n = &needle[needle_last];
      
      //被查找子串的开始地址,for中地址逐次+1
      register CONST char *h = begin;
	
      do
	if (*h != *n)//字符比较不同,直接结束,执行下一次for循环
	  goto loop;		/* continue for loop */
      while (--n >= needle && --h >= haystack);//继续向前比较查找字符

      return (char *) h;

    loop:;
    }

  return NULL;
}

strsr个人实现(仅供参考)

char * mystrstr(char * des,char * src)
{
        char * desstring;
        char * srcstring;
        if(des == NULL || src == NULL)
        {
                printf("no des or src\n");
                return NULL;
        }

        while(*des != '\0')
        {
                desstring = des;
                srcstring = src;

                while(*desstring == *srcstring )
                {
                        desstring++;
                        srcstring++;
                        if(*srcstring == '\0')
                                return des;
                }
                des++;
        }
        return NULL;
}

源码实现肯定比个人更加规范,严谨,代价就是阅读性差,不易理解,笔者实现仅做了简单测试,不是是否存在漏洞,所以这里仅供参考,如果有错误的地方,欢迎评论指正。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值