计划通过编写C语言常见的库函数练习C语言基本功。
每写一个函数都包括三个过程:
1. 通过Linux man命令查看库函数的描述,重点是入参和返回值;
2. 自己不参考任何内容实现库函数的功能;
3. 对比glibc里库函数的实现,做总结;
1. strcmp()形式如下: int strcmp(const char *s1, const char *s2)
2. 我的实现:
/*
1. 从左往右依次比较每个字符,如果相等继续比较下一个字符,如果不等立刻返回 s1的字符减去s2的字符
2. 以s1出现字符串结束符为循环退出条件
*/
int strcmp7(const char *s1, const char *s2)
{
//需要判断字符串结束符,否则指针加加会越界
while (*s1 != '\0')
{
if (*s1 == *s2)
{
s1++;
s2++;
}
else
{
return (*s1 - *s2);
}
}
return (*s1 - *s2);
}
3. glibc的实现:
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 == '\0')
return c1 - c2;
}
while (c1 == c2);
return c1 - c2;
}
我认为两个函数只是循环退出的条件不同,其他地方没有实质性的区别。两个函数都做了初步测试,没发现问题。