免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6366 | 回复: 20
打印 上一主题 下一主题

挑战超强版TRIM [复制链接]

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-25 12:49 |只看该作者 |倒序浏览
本帖最后由 damcool 于 2011-01-25 18:41 编辑
  1. void trim(char * str)
  2. {
  3.     char * header,*tail;
  4.     if (str==NULL) return;
  5.     header=str;
  6.     tail=str+strlen(str);
  7.     while ((header<tail) && ((*header<=32)||(*tail<=32)))
  8.     {
  9.         if (*header<=32) *header++=0;
  10.         if (*tail<=32) *tail--=0;
  11.     }
  12.     while (*header>0)
  13.     {
  14.         *str++=*header++;
  15.     }
  16.     *str=0;
  17. }
复制代码
版本二:不用strlen
  1. void trim(char * str)
  2. {
  3.     char * header,*tail;
  4.     if (str==NULL) return;

  5.     header=str;

  6.     tail=NULL;
  7.     while ((*header>0) && (*header<=32))
  8.     {
  9.         header++;
  10.     }

  11.     while (*header>0)
  12.     {
  13.         if (*header>32) tail=header;
  14.         *str++=*header++;
  15.     }
  16.     if (tail!=NULL) str-=--header-tail;
  17.     *str=0;
  18. }
复制代码
版本三,不用strlen,只用单循环。
  1. void trim(char * str)
  2. {
  3.     char * header,*tail;
  4.     if (str==NULL) return;

  5.     header=str;

  6.     tail=NULL;
  7.     while (*header>0)
  8.     {
  9.        if (*header>32) tail=header;
  10.        if (tail!=NULL) *str++=*header++;
  11.        else header++;
  12.     }

  13.     if (tail!=NULL) str-=--header-tail;
  14.     *str=0;
  15. }
复制代码
版本四,应对超长空白在末端的情况。
  1. void trim(char * str)
  2. {
  3.     char * nowPos,*lastPos;
  4.     if (str==NULL) return;

  5.     nowPos=str;
  6.     lastPos=NULL;
  7.     while (*nowPos>0)
  8.     {
  9.        //上次停止复制处到目前非空白字符间的字符进行复制
  10.        if ((*nowPos>32) && (lastPos!=NULL))
  11.        {
  12.            while(lastPos<=nowPos)
  13.            *str++=*lastPos++;
  14.        }
  15.        //左边空白处理结束,记住第一个非空白字符位置
  16.        if ((*nowPos>32) && (lastPos==NULL))
  17.        lastPos=nowPos;
  18.        nowPos++;
  19.     }
  20.     *str=0;
  21. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-01-25 13:05 |只看该作者
回复 1# damcool


    怎么超强了?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2011-01-25 13:17 |只看该作者
冗余判断,冗余赋值,一点也不强

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
4 [报告]
发表于 2011-01-25 13:49 |只看该作者
冗余判断,冗余赋值,一点也不强
hellioncu 发表于 2011-01-25 13:17



    请指明冗余判断处,冗余复制可能有。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2011-01-25 13:53 |只看该作者
请指明冗余判断处,冗余复制可能有。
damcool 发表于 2011-01-25 13:49



    while和里面的if冗余判断,虽然比较运算一般会被优化掉,但两个if最终还是有两个跳转语句

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
6 [报告]
发表于 2011-01-25 14:32 |只看该作者
while和里面的if冗余判断,虽然比较运算一般会被优化掉,但两个if最终还是有两个跳转语句
hellioncu 发表于 2011-01-25 13:53



    原作里的for内加if和while内加if不是一样?另外,不用if也可以的,这样可读性就会很差。值得吗?另外原trim功能上也有缺陷。

论坛徽章:
0
7 [报告]
发表于 2011-01-25 15:48 |只看该作者
说真话。算法很烂!TRIM 最多遍历一次就行了。而 tail=str+strlen(str);没必要!

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
8 [报告]
发表于 2011-01-25 16:18 |只看该作者
说真话。算法很烂!TRIM 最多遍历一次就行了。而 tail=str+strlen(str);没必要!
zhangsuozhu 发表于 2011-01-25 15:48



    你有看懂了吗?我的trim也只遍历了一次而已。没看懂别发言好不!

论坛徽章:
0
9 [报告]
发表于 2011-01-25 16:48 |只看该作者
回复 8# damcool


    strlen(str); 算不?

论坛徽章:
0
10 [报告]
发表于 2011-01-25 17:15 |只看该作者
回复 1# damcool


    就这代码挑战个毛啊
1. 你用了两个循环,原版只用了一个
2. 你用了strlen
3. 代码中有多余的赋值操作。
4. 你的做法,条件判断也比原版多一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP