strcmp()函数自实现

来源:互联网 发布:电脑自动开关机软件 编辑:程序博客网 时间:2024/06/05 15:48

今天继续来模拟实现库函数------strcmp()。

写my_str_cmp()函数之前,先了解一下它的定义:

strcmp

C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1>str2,则返回正数;
若str1<str2,则返回负数。

要说的是,str1 > str2 时返回一个正数就好,具体这个数字是几,是无所谓的;str1 < str2 时返回一个负数就好,具体这个数字是几,也是无所谓的。在vs的环境里面,这个值分别是1 和 -1.

所以,像下面这样的语句,是有问题的:

int ret = strcmp(str1, str2);if (ret == 1)printf("arr1 > arr2\n");else if (ret == -1)printf("arr1 < arr2\n");elseprintf("arr1 == arr2\n");

现在就来建立整体的框架:

#include <stdio.h>int main(){char arr1[] = "hello world !";char arr2[] = "hello c !";int ret = my_strcmp(arr1, arr2);if (ret > 0)//输出显示printf("arr1 > arr2\n");else if (ret < 0)printf("arr1 < arr2\n");elseprintf("arr1 == arr2\n");system("pause");return 0;}

然后开始写my_strcmp()函数:

int my_strcmp(const char * left,const char * right)//*left和*right的值不需要修改,加上const修饰{assert(left);//断言传进来的两个指针非空assert(right);while (*left == *right) {//比较当前字符,相同则进while循环if (*left == '\0')//当前字符相等的基础上,又发现为'\0',return 0;//所以两串相等++left;++right;}return *left - *right;//来到这里,当前字符必定不等,直接返回差}

写到这里,my_strcmp()函数就实现完了,测试一下,发现跟预想的结果一样。

再来与真正的库函数比较一下:

int __cdecl strcmp (        const char * src,        const char * dst        ){        int ret = 0 ;        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)                ++src, ++dst;        if ( ret < 0 )                ret = -1 ;        else if ( ret > 0 )                ret = 1 ;        return( ret );}
其实只有一些小的差别了,读者自己发现吧!


1 0