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