库函数strcmp的实现

来源:互联网 发布:java游戏破解版网站 编辑:程序博客网 时间:2024/06/03 18:04

在c语言中,库函数strcmp是一个运用很频繁的函数,它的功能是比较两个字符串的大小,字符串怎么比较大小呢?

其实是比较相同位置上字符的ASC码值的大小。

举个例子:

"abc"和"acb"两个字符串,比较大小,很显然是后者大,我们来分析一下:

比较大小是以一个一个字符比较,a与a比较相同,再比较下一个,b与c比较很显然c的ASC码值要大,所以后者大。

那么有人要问比较这里后面就不用比较了吗??

答案是:“是的”。

来我们看一下具体代码:

int strcmp(const char *string1,const char *string2){int ret = 0;assert(string1);assert(string2);while(!(ret = *(unsigned char *)string1 - *(unsigned char *)string2) && *string2){string1++;string2++;}if(ret<0){ret = -1;}else if(ret>0){ret = 1;}return ret;}
我们来分析一下代码;

首先为什么返回值是int?

因为strcmp比较是已大于等于小于0来判断两个字符串是否相等。

具体来说,比如string1>string2  那么返回结果是1,即大于0。

如果string1<string2  返回值为-1 ,结果小于0。

相等就返回0。

所以一般用都要跟上判断,例如:

int main(){char arr[] ="hello world";char arr1[] = "hello wordl";if(strcmp(arr,arr1)==0){printf("相等\n");}else{printf("不相等\n");}return 0;}

这只是一种用法,灵活运用还的多练习。


assert断言,是用来判断传过来的指针是是否为空,增强了代码的健壮性;


主要代码核心(!ret = *(unsigned char *)string1 - *(unsigned char *)string2)&&*string2,我们来分析一下,

用unsigned char*  强转因为我们相减的字符ASC码值为正数没有负数,也就是无符号数,

为什么取反,在判断中如果相等即ret为0,这样就会跳出循环体,所以取反后判断不为0,就会进行下一个字符比较,而&&string2是判断结束,这里string2也可以换成

string1,怎么判断呢?当两个字符串相同时,比较到最后一个字符\0  字符相减ret==0,取反成立,所以就要看string1或者strint2的字符,如果是\0表示0为假跳出循环。



原创粉丝点击