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


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


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值