strcmp实现以及为什么要通过unsigned char转换
来源:互联网 发布:centos 7 中文语言包 编辑:程序博客网 时间:2024/06/09 14:52
view plaincopy to clipboardprint?int strcmp(const char* str1,const char* str2){ assert(str1!=NULL&&str2!=NULL); while(*str1&&*str2&&*str1==*str2){ str1++; str2++; } if(*str1==*str2&&*str1==0) return 0;//equal else if(*str1<*str2) return -1; else return 1; } int strcmp(const char* str1,const char* str2){ assert(str1!=NULL&&str2!=NULL); while(*str1&&*str2&&*str1==*str2){ str1++; str2++; } if(*str1==*str2&&*str1==0) return 0;//equal else if(*str1<*str2) return -1; else return 1;}
看看上面代码有问题吗?
乍看,这个程序思路非常清楚,应该没什么问题的,是这样吗?在我们能尝试的一些字符串中这个函数是的确没问题的,而且在VC上拿它和string.h中的strcmp函数进行比较,发现两个函数每次的结果都是一样的。而我们往往遗忘了一种情况:如果一个字符值的ASCII码值超过127,该如何比较?也就是说,这类字符是非常规、不常用的字符。如果采用上面的方法,会得到相反的结果。如字符¥的ASCII码值在850 (Latin 1)为190,将其和"a"比较,上面的代码得到的结果是-1;而使用标准库函数得到的结果是1。理论上讲,ASCII值大的应该返回1,而上面程序刚好相反。
具体原因在于,对于超过127的字符在使用上面的函数时(默认上代码中实际也都是这么处理的)将该字符串视为符号(signed)的字符串,所以超过127的字符或按照对应的2进制补码转换为对应的负数,从而产生上面错误的结果。如¥所存的值为190-256=-66,-66<97,所以程序判断¥<a,返回-1。所以在处理时应该统一将其转换为对应的无符号型,下面代码参考微软VC6.0中对应的strcmp部分代码,正是进行了这种转换:
<pre name="code" class="html"> int strcmp(const char* str1,const char* str2) { assert(str1 != NULL && str2 != NULL); int ret=0; while(!(ret=*(unsigned char *)str1-*(unsigned char *)str2) && *str1) { str1++;str2++; } if(ret<0) ret = -1; else if(ret > 0) ret = 1; return ret;}
0 0
- strcmp实现以及为什么要通过unsigned char转换
- strcmp为什么要用unsigned char
- (转)strcmp为什么要用unsigned char
- unsigned char qstring,转换
- unsigned char与char 转换
- char * /const char */unsigned char * 转换
- unsigned char 转换为 unsigned long方法
- QString unsigned char* 的转换
- unsigned char*转换成const char*
- const char*怎么转换成unsigned char*
- CString类型怎样转换成unsigned char *
- 补码和数的转换(unsigned/char|int)
- BCD 码与 unsigned char 转换
- unsigned char* 类型数据转换字符串 string
- ip地址转换: char * <---> unsigned int
- 将char转换为unsigned int时
- char*: strcmp
- array<Byte>^ unsigned char* char* 之间的转换
- Android控件之圆角的Button和其他控件的使用
- Spring初识和环境搭建
- IE卫士v1.02 --- 一款完全免费的IE修复工具
- convolutional pose machines, CVPR 2016
- HDU 2602 Bone Collector (0-1背包问题)
- strcmp实现以及为什么要通过unsigned char转换
- java io文件读写的总结
- HDU.5128 The E-pang Palace
- Struts2实现文件上传
- Java 异常
- 【NSBD】——My first Map
- Oracle 函数
- 数据结构实验之二叉树的建立与遍历
- 实现一个函数,把字符数组中的每个空格替换成“%20”。 例如输入“we are happy.”,则输出“we%20are%20happy”