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来实。
- strcmp函数
- strcmp() 函数
- strcmp() 函数
- strcmp函数
- strcmp函数
- strcmp函数
- strcmp函数
- strcmp函数
- strcmp函数
- strcmp函数
- strcmp函数
- strcmp()函数
- strcmp函数
- 函数 strcmp
- strcmp函数
- strcmp函数
- strcmp 函数
- strcmp 函数
- 此 SqlParameterCollection 的 Count=4 的索引 4 无效。
- 中文乱码在java中URLEncoder.encode方法要调用两次解决
- 数据结构之Chain类
- 第二章 创建对话框 2.3快速设计对话框
- 最简单zTree应用案例
- strcmp函数
- 腾讯2014春季实习生招聘 笔试题目 第一批次
- A - Lotto
- 【并查集】hdu 1856 More is better
- php基础知识(二)
- TextView的setText方法
- ubuntu 12.04 简单配置samba服务,实现主机与虚拟机互通
- 黑马程序员_.NET类和对象
- JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用。