int strcmp(const char* s1,const char* s2)
2013-01-07 17:51
204 查看
自己实现了一下strcmp,代码如下:
看了一下c库中的代码,感觉自己水平和别人还是存在差距
为什么使用unsigned char呢?这是因为char的表示范围是-128~127,unsigned char的表示范围是0~255。如果不使用unsigned char的话,传入ASCII不会出现问题,但是若传入扩展ASCII码会出现问题。原因请看下面的程序:
程序的输出结果为:140 -116,其中-116背离了字符本来的意义,140放入char中,使用二进制表示是:10001100,如果转换为unsigned char,然后转化为整形的话,输出的为140;但是如果直接转化的话,最开始的1被当成符号位,因为这是补码,故其表示的实际值为补码求反加1,为-(1110011+1)=-116。
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。
相关文章推荐
- NSValue的使用...@encode(type)...int strcmp(const char *, const char *); 返回 0 表示相等
- int strlen(const char *str)
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等----留着备用
- C++学习笔记:int sprintf ( char * str, const char * format, ... );
- int open(const char * pathname, int flags); http://c.biancheng.net/cpp/html/238.html
- GetWindowTextW(LPTSTR,int) const' :cannot convert parameter 1 from 'char[10]
- int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LPTSTR”
- long int strtol(const char *nptr, char **endptr, int base)
- C++中int、string、const char*、CString之间的相互转换
- “strcmp”: 不能将参数 1 从“LPWSTR”转换为“const char *”
- “strcmp”不能将参数从“LPWSTR”转换为“const char *”
- Cstring 转 int 型问题(error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *”))
- int strcmp(char *source, char *dest)函数
- error C2556: 'void __thiscall ::sendCommand1(unsigned int,const char *,int)' : overloaded function differs only by return type f
- char*const*(*next)(int)
- int sprintf_s(char *,size_t,const char *,...)”: 不能将参数 2 从“const char [3]”转换为“size_t”
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date
- (c++) int 转 string,char*,const char*和string的相互转换
- typedef int Myfunc(const char*, const struct stat *, int)问题的思考
- Linux int lstat(const char *path, struct stat *buf);