strcmp为什么要用unsigned char
来源:互联网 发布:人工蜂群算法 java 编辑:程序博客网 时间:2024/06/02 03:06
字符串比较函数,这个函数也比较常用:
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;
}
看看上面代码有问题吗?
乍看,这个程序思路非常清楚,应该没什么问题的,是这样吗?在我们能尝试的一些字符串中这个函数是的确没问题的,而且在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部分代码,正是进行了这种转换:
view plaincopy to clipboardprint?
int strcmp(const char* str1,const char* str2){
int ret=0;
while((ret=*(unsigned char *)str1-*(unsigned char *)str2)==0&&*str2)
str1++;str2++;
if(ret==0)
return 0;
else if(ret<0)
return -1;
else
return 1;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/PeterPan19890802/archive/2010/04/07/5459569.aspx
- strcmp为什么要用unsigned char
- (转)strcmp为什么要用unsigned char
- strcmp实现以及为什么要通过unsigned char转换
- 为什么C++中字节用 unsigned char 来表示
- char*: strcmp
- unsigned char, unsigned int
- (unsigned char *)
- unsigned char
- unsigned char
- 为什么(-1)转化为unsigned char变为255
- char, unsigned char, signed char 为什么会存在三种类型
- signed char & unsigned char
- unsigned char与char
- unsigned char和char
- unsigned char与char
- char 与 unsigned char
- unsigned char 与 char
- char 与 unsigned char
- Lucene的工作原理(转载)
- 数组转化为Json格式
- arm-linux-ranlib:command not found
- Reflector 使用简介
- The expected argument types are (java.util.Map) but the supplied types were(java.lang.String) and converted to (null).
- strcmp为什么要用unsigned char
- C#开源资源大汇总
- Hadoop Job Tuning
- Python代码模块热更新机制实现(reload)
- LINK : 没有找到 *.exe 或上一个增量链接没有生成它;正在执行完全链接
- 堆和栈的区别
- linux下大小写字符转换
- 数据库优化
- WinForms程序加上启动动画