您的位置:首页 > 其它

int strcmp(const char* s1,const char* s2)

2013-01-07 17:51 204 查看
自己实现了一下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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐