各位看官们,大家好,上一回中咱们说的是DIY字符串连接函数的例子,这一回咱们说的例子是:DIY字符串比较函数。闲话休提,言归正转。让我们一起talk C栗子吧!
我们在前面的章回中介绍过字符串比较函数,时间不长,但是有些看官已经忘记了,为了加深看官们对字符串比较函数的印象,我们准备DIY字符串比较函数。Just do it by yourself!
我们在前面的章回中一共介绍了两个字符串比较函数:strcmp,strncmp。接下来我们分别介绍如何DIY这两个字符串比较函数。
DIY strcmp函数
int diy_strcmp(const char s1, const char s2)
- 1.在s1和s2所指向的字符串中,分别取出一个字符进行比较;
- 2.判断这两个字符的ASCII码值大小,如果它们的值相等,那么返回第一步,比较下一个字符;否则,进入下一步;
- 3.返回这两个字符的ASCII码差值;
- 4.重复步骤1到3,直到取出的字符是s1或者s2的小尾巴为止。
下面是我写的代码,请大家参考:
int diy_strcmp(const char *s1, const char * s2)
{
int res = 0;
if(NULL == s1 || NULL == s2)
{
printf("NULL pointer error \n");
return 0 ;
}
while(*s1 != ‘\0‘ && *s2 != ‘\0‘)
{
if(*s1 == *s2)
{
s1++;
s2++;
}
else
{
res = *s1 -*s2;
break;
}
}
if(res == 0)
res = *s1 -*s2; // the ASCII value of \0 is 0
return res;
}
通过上面的代码,大家可以看到,我们使用两个字符的ASCII码差值做为比较的结果,并且在比较过程中计算该结果。如果没有计算该结果,可能是遇到s1或者s2的小尾巴了,那么我们再计算一次。计算的时候,巧妙利用了空字符的ASCII码值。如果在比较过程中遇到空字符,那么停止比较。这时候计算结果时,两个字符中至少有一个是空字符。而空字符的值为零,使用它减去其它字符,就会得到一个负数。使用其它字符减去它,就会得到一个正数。这也正是我们想要的结果。
下面是标准库中strcmp函数的代码,请大家和我们DIY的代码进行比较:
/**
* strcmp - Compare two strings
* @cs: One string
* @ct: Another string
*/
#undef strcmp
int strcmp(const char *cs, const char *ct)
{
unsigned char c1, c2;
while (1) {
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)
return c1 < c2 ? -1 : 1;
if (!c1)
break;
}
return 0;
}
通过对比,大家可以看到标准库提供的代码更加简洁一些,不过比较的思路是相同的。在返回结果中,标准库中的代码只返回-1,1和0这三种值。而我们DIY的代码中返回值与字符串中的字符有关,当然了,两个字符串相等时仍然返回1。
DIY strncmp函数
int diy_strncmp(const char s1, const char s2,int n)
- 1.在s1和s2所指向的字符串中,分别取出一个字符进行比较;
- 2.判断这两个字符的ASCII码值大小,如果它们的值相等,那么返回第一步,比较下一个字符;否则,进入下一步;
- 3.返回这两个字符的ASCII码差值;
- 4.重复步骤1到3,直到满足下面两个条件中的任何一个条件为止。
- 条件一:取出的字符是s1或者s2的小尾巴;
- 条件二:已经比较了n个字符;
下面是我写的代码,请大家参考:
int diy_strncmp(const char *s1, const char * s2,int n)
{
int res = 0;
if(NULL == s1 || NULL == s2)
{
printf("NULL pointer error \n");
return 0 ;
}
while(n)
{
if(*s1 != ‘\0‘ && *s2 != ‘\0‘)
{
if(*s1 == *s2)
{
s1++;
s2++;
n--;
}
else
{
res = *s1 -*s2;
break;
}
}
else
break;
}
if(n > 0) // diffenent conditions
res = *s1 -*s2; // the ASCII value of \0 is 0
return res;
}
通过上面的代码,大家可以看到strncmp在比较过程中增加了对n的判断,如果n小于s1或者s2中的字符数量时,比较过程和strcmp相同,否则需要再计算一次比较结果,也就是代码中“if(n>0)” 这种情况。
下面是标准库中strncmp的代码,请大家和我们DIY的代码进行比较:
/**
* strncmp - Compare two length-limited strings
* @cs: One string
* @ct: Another string
* @count: The maximum number of bytes to compare
*/
int strncmp(const char *cs, const char *ct, size_t count)
{
unsigned char c1, c2;
while (count) {
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)
return c1 < c2 ? -1 : 1;
if (!c1)
break;
count--;
}
return 0;
}
通过对比,大家可以看到标准库提供的代码更加简洁一些,不过比较的思路是相同的。在返回结果中,标准库中的代码只返回-1,1和0这三种值。而我们DIY的代码中返回值与字符串中的字符有关,当然了,两个字符串相等时仍然返回1。
看官们,我把这两个DIY函数整理成了一个文件,并且添加了详细的注释,除此之外,我还使用了前面章回中的测试case进行测试。正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。前面章回中的程序可以点击这里下载。
下面是程序运行的结果,请大家和前面章回中的程序运行结果进行对比。
----------- testing diy_strcmp -----------
abcd < abdc
abcd > ABCD
abcd > abc
abcd = abcd
----------- testing diy_strncmp -----------
3 of abcd < abdc
2 of abcd = abdc
2 of abcd > ABCD
5 of abcd > abc
各位看官,关于DIY字符串比较函数的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。