strcmp函数

来源:互联网 发布:php erp系统 编辑:程序博客网 时间:2024/04/25 16:30

strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果,函数形式如下:

 intstrcmp(constchar*str1,constchar*str2); 

其中str1和str2可以是字符串常量或者字符串变量,返回值为整形。

返回结果如下规定: 

①str1小于str2,返回负值或者-1(VC返回-1);

②str1等于str2,返回0;

③str1大于str2,返回正值或者1(VC返回1); 


strcmp函数实际上是对字符的ASCII码进行比较,实现原理如下:首先比较两个串的第一个字符,若不相等,则停止比较并得出两个ASCII码大小比较的结果;如果相等就接着比较第二个字符然后第三个字符等等。无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,就能得出结果。strcmp算法的可以有多种,不过我觉的可以把这么多算法分为两种,一种是利用减法运算判断结果,另一种是利用比较运算(==)得出结果。减法运算的实现的代码如下:

1   int strcmp(constchar*str1,constchar*str2)

2

3 intret=0; 

4 while(!(ret=*(unsignedchar*)str1-*(unsignedchar*)str2)&&*str1)

5

6 str1++;

7 str2++

8

9

10

11 if(ret<0)

12

13 return-1;

14 }

15 else if(ret>0)

16 {

17 return 1;

18

19 return0; 

20 }

这个函数要注意一下几点

①使用*(unsignedchar*)str1而不是用*str1。这是因为传入的参数为有符号数,有符号字符值的范围是-128~127,无符号字符值的范围是0~255,而字符串的ASCII没有负值,若不转化为无符号数这回在减法实现时出现错误。

例如str1的值为1,str2的值为255。 

作为无符号数计算时ret=-254,结果为负值,正确

作为有符号数计算时ret=2,结果为正值,错误 


这是C/C++语言的一个dark corner。
无符号数的减法运算能保证只要数字每位一样,那么相减必定为0。反之也成立。
而带符号数无法保证这一点。也就是说,当相减为0时,两数的每一位不一定相等。

LZ可以试试下面的代码:

C/C++ code

signed char a = 0;
signed char b = -128;
signed char c = a - b;

②While循环中ret=*(unsignedchar*)str1-*(unsignedchar*)str2)&&*str1,最后与上str1也可以换成str2,因为前面已经做了相减,无论哪个先为‘\0’都会退出。因为最后与上str1是为了判断str1是否结束,即是否为‘\0’。

③这个函数没有判断参数为NULL时的情况,所以当传入NULL时程序会崩溃。

网上看别人说商业化代码都会在调用strcmp前先判断是否为NULL,所以可以不用判断NULL;我在VC6上测试string.h中的strcmp(NULL,NULL),程序也会崩溃。这里可以根据实际情况来决定。 

若要判断NULL按下面方法更改代码,可以在这个函数最前面加入断言assert((NULL!=str1)&&(NULL!=str2)) 但要注意断言assert是仅在Debug版本起作用的宏,是在Debug时做的无害测试。

若想在Release版也可 以判断NULL,那我们必须用别的代码来判断。可以在程序前面加入if判断 if((NULL!=str1)&&(NULL!=str2)){ return0;} 我用CFree5测试sting.h中的strcmp(NULL,NULL),程序返回值为0(strcmp(NULL,str1)崩溃),这里我们可以返回其他的值如-2。我们也可以在函数前面加入while判断while((NULL!=str1)&&(NULL!=str2)){ //strcmp实现代码} return0;

利用while就可以把每个字符都进行判断。

利用比较运算(==)算法如下

21 

22 int strcmp(const  char*  str1,const  char*  str2)

23 {

24 while((*str1)&&(*str1==*str2))

25

26 str1++;

27 str2++;

28

29

30

31 if(*(unsignedchar*)str1>*(unsignedchar*)str2)

32

33 return1;

34

35 else if(*(unsignedchar*)str1<*(unsignedchar*)str2)

36

37 return-1;

38 }

39 else

40

41 return0;

42

43

函数注意点和上面一样,有一点要注意不要为了简洁而写成下面

44 

45  int  strcmp(constchar*str1,constchar*str2)

46 {

47 while((*str1)&&(*str1++==*str2++))//这里++会引起错误

48 {

49 NULL;

50

51

52

53 if(*(unsignedchar*)str1>*(unsignedchar*)str2)

54

55 return1;

56

57 elseif(*(unsignedchar*)str1<*(unsignedchar*)str2)

58

59 return-1;

60 }

61 else

62

63 return0;

64

65

当str1为abcd,st2为abfd时,由于判断到第三个字符时while推出,而str指针又加了1,str都指向第四个字符输出结果为0,显然这是错误的。

这个函数也可以用for来实。

0 0
原创粉丝点击