现在的位置: 首页 > 综合 > 正文

CSDN的BLOG评论和联系作者发送邮件好象有问题,请管理员解决

2014年02月24日 ⁄ 综合 ⁄ 共 1131字 ⁄ 字号 评论关闭

         今天我看到一篇老帖子,是名字为 写程序是一种态度(一)strcmp  http://blog.csdn.net/swguru/archive/2002/08/05/17174.aspx

         觉得文章后面的几个问题很值得思考,于是想联系作者,询问正确答案看自己思考的是否正确全面,

可是点击发送邮件,却发送不出去,没办法只要跑到那篇文章下面发表评论,可是一连点了几次都提示

验证码错误(好象我还没白痴到几个数字字母都识别不出来,输错的地步)

          不知道大家是否也遇到同样的问题。希望管理员能清查下此类故障,给我们提供一个良好的交流环境。

          另附 问题和答案,希望得到大家和作者的帮助。

       

问题:

分析经典代码是一种最佳方式,我将从最简单但又最绝妙的开始:strcmp

 

int __cdecl 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 );

}

 

这是MS C run-time中的strcmp实现源码。几个问题将揭示它的精髓,会对我们写出相应功能的高质量代码提供指导。

 

1.srcdst都为空串如何返回?

2.为什么要用unsigned char*强制转换?

3.可否用*src替换*dst作为while条件?

4.是否是multithread-safe

5.能否用于multibyte-character strings的比较?

6.能否用更少行表达?

我的理解为:

问题1是返回0值(即相等)
问题2应该是为了避免出现有符合和无符号字符型数据相减(可是有这种可能吗,这里搞不懂,请指教)
问题3应该是可以替换
问题4应该是不是
问题5为不能
问题6应该可以吧。(如        while( ! (ret = *(unsigned char *)src++ - *(unsigned char *)dst++) && *dst)

还有一个问题就是这个函数怎么没考虑实参为NULL的时候?而且我特意在VC6中试验过,如果其值为NULL会非法,可是自己又怀疑微软的程序员不会犯这种错误。

【上篇】
【下篇】

抱歉!评论已关闭.