关于strcmp的实现代码

yangkunhenry 2009-09-05 05:42:56

int strcmp ( const char* src, const char* dst )
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
//就不知道为什么要强制转换为unsigned char,难道真是网上说的提高效率?
//提高效率怎么个提高法?
...全文
332 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
x2x2x2 2009-09-05
  • 打赏
  • 举报
回复
学习之
asimay 2009-09-05
  • 打赏
  • 举报
回复
因为如果不指定无符号,像(1-(-2))=3,ret>0, 实际上需要的是ret=-1<0。

bpttc 2009-09-05
  • 打赏
  • 举报
回复
char 究竟是有符号还是无符号,C99标准没有规定,由编译器制作者来决定。
zhouqiang312 2009-09-05
  • 打赏
  • 举报
回复
学习了
pmerOFc 2009-09-05
  • 打赏
  • 举报
回复
为了正确地求出ret的值
这涉及到字符大小的定义
有的系统char 是 signed char
有的系统char 是 unsigned char
也就是前面有些网友提到的扩展ASII码的问题
比如
某个字符 1111 1111
另一个字符 0000 1111
如果系统的char 是 signed char
那么
*src - *dst 的结果是前者小
而*(unsigned char *)src - *(unsigned char *)dst的结果是前者大

fiyaa 2009-09-05
  • 打赏
  • 举报
回复
学习
tomhour 2009-09-05
  • 打赏
  • 举报
回复
虽然是遇到个错改一个,但是不积累些...效率太低了!
amossavez 2009-09-05
  • 打赏
  • 举报
回复
主要是为了扩展ASII码!
hemy818 2009-09-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mstlq 的回复:]
惭愧啊……
c课本只看过一本,谭教授的……
[/Quote]
遇到一个错改一个错
看那么多书 看了也记不得
mstlq 2009-09-05
  • 打赏
  • 举报
回复
惭愧啊……
c课本只看过一本,谭教授的……
银河里游方舟 2009-09-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mstlq 的回复:]
为了确保'\0'是最小的字符……
为了能对扩展ASCII字符串进行排序……

另外,据飞雪说,有些系统上的char范围是-128~~127,有些则是0~~255……
有必要用个unsigned统一一下……
[/Quote]
这个在K&R的书上有提过
mstlq 2009-09-05
  • 打赏
  • 举报
回复
为了确保'\0'是最小的字符……
为了能对扩展ASCII字符串进行排序……

另外,据飞雪说,有些系统上的char范围是-128~~127,有些则是0~~255……
有必要用个unsigned统一一下……
whg01 2009-09-05
  • 打赏
  • 举报
回复
转成unsigned char是为了更好支持欧洲语言的字符及多字节编码。因为这些里面有的字符最高bit是1。
和效率无关。

xu044 2009-09-05
  • 打赏
  • 举报
回复
应该是为了能够打印扩展ASCII码字符
hoomey 2009-09-05
  • 打赏
  • 举报
回复
学习

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧