码迷,mamicode.com
首页 > 编程语言 > 详细

一起talk C栗子吧(第六十六回:C语言实例--DIY字符串比较函数)

时间:2015-11-28 21:40:22      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:


各位看官们,大家好,上一回中咱们说的是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字符串比较函数的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。


一起talk C栗子吧(第六十六回:C语言实例--DIY字符串比较函数)

标签:

原文地址:http://blog.csdn.net/talk_8/article/details/50086843

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!