自己实现了一下strcmp,代码如下:
int strcmp(const char* s1,const char* s2){
while(*s1!='\0'&&*s2!='\0'){
if(*s1<*s2)
return -1;
else if(*s1>*s2)
return 1;
else{
s1++;
s2++;
}
}
if(*s1=='\0'&&*s2=='\0')
return 0;
if(*s1=='\0')
return -1;
if(*s2=='\0')
return 1;
}
看了一下c库中的代码,感觉自己水平和别人还是存在差距
int strcmp(const char* s1,const char* s2){
for(;*s1==*s2;++s1,++s2)
if(*s1=='\0')
return 0;
return ((*(unsigned char*)s1<*(unsigned char*)s2)?-1:1);
}
为什么使用unsigned char呢?这是因为char的表示范围是-128~127,unsigned char的表示范围是0~255。如果不使用unsigned char的话,传入ASCII不会出现问题,但是若传入扩展ASCII码会出现问题。原因请看下面的程序:
#include<stdio.h>
#include<stdlib.h>
int main(){
char a=140;
int a1=(unsigned char)a;
int a2=a;
printf("%d %d",a1,a2);
system("pause");
}
程序的输出结果为:140 -116,其中-116背离了字符本来的意义,140放入char中,使用二进制表示是:10001100,如果转换为unsigned char,然后转化为整形的话,输出的为140;但是如果直接转化的话,最开始的1被当成符号位,因为这是补码,故其表示的实际值为补码求反加1,为-(1110011+1)=-116。