免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: flw
打印 上一主题 下一主题

【原创】超强版 Trim 横空出世! [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2004-03-02 16:43 |只看该作者

【原创】超强版 Trim 横空出世!

原帖由 "FH" 发表:
不错!

但我觉得应该把所有控制符都去掉,举个例子:BS也应该处理吧?而且处理起来还很复杂。STX,ACK等等有意义吗?
我都是判<=空格的,又干净效率还高。


呵呵,这个就不好说了,比如我们公司的接口中,都用 \1 来当做字段的分隔符,所以是不能去掉的。
通常情况下,<32 的字符由于大多是不可见字符,实际应用中用不着,所以恰恰被很多接口采用为转义字符、分隔符、类型符、控制符等等,所以绝对是不可以去掉的。


再说了,要是想去掉,改一下我这个代码就可以了。
反正又不影响算法的效率:“时间复杂度”和“空间复杂度”,
所以我不会在意的。

我在意的是:我的这个算法有没有漏洞?有没有人能写出比我这个更好的算法?

论坛徽章:
0
12 [报告]
发表于 2004-03-02 16:49 |只看该作者

【原创】超强版 Trim 横空出世!

不错不错,用了两个指针记录位置,tail只有在不是空格的情况下才写入,这样在tail不为空的时候就记录下了最后的空格出现的位置。

论坛徽章:
0
13 [报告]
发表于 2004-03-02 16:53 |只看该作者

【原创】超强版 Trim 横空出世!

不错,我觉得从算法而言,确实没有简化的余地了。

论坛徽章:
0
14 [报告]
发表于 2004-03-02 17:12 |只看该作者

【原创】超强版 Trim 横空出世!

算法不错!
但对用STX来做分隔符不赞同,控制码里也有专门的符号的,FS就是嘛!
这个算法在尾部空格较多时有损失。
我再给你简化一下,主要是从效率角度考虑:

  1. void trim( char *str )
  2. {
  3.         char *copied;
  4.         char *tail;
  5.         char c;

  6.         if ( str == NULL )
  7.                 return;

  8.         for ( copied = str, tail = NULL; ( c = *str ) != 0; str ++ )
  9.         {
  10.                 if ( c != ' ' && c != '\t' )
  11.                 {
  12.                         *copied ++ = c;
  13.                          tail = copied;
  14.                 }
  15.                 else
  16.                 {
  17.                          if ( tail != NULL )
  18.                                  *copied ++ = c;
  19.                 }
  20.         }

  21.         if ( tail != NULL )
  22.              *tail = 0;
  23.         else
  24.              *str = 0;
  25. }
复制代码

论坛徽章:
0
15 [报告]
发表于 2004-03-02 17:21 |只看该作者

【原创】超强版 Trim 横空出世!

不好意思刚才出去吃饭了,刚回来,我根本没激动,只不过我觉得tail的指针处理上有问题,手里没有编译器,这段代码考一下,回去调试调试。

论坛徽章:
0
16 [报告]
发表于 2004-03-02 17:22 |只看该作者

【原创】超强版 Trim 横空出世!

现在想找楼主研究一下,遗憾!晚了!!!555

论坛徽章:
0
17 [报告]
发表于 2004-03-02 17:32 |只看该作者

【原创】超强版 Trim 横空出世!

flw老兄的代码写得非常好,我是绝对写不出来的,在这个问题上,我只发表过一次代码,而且效率不高,剩下的帖子,倒像个批评家。
不过,这次我还是想做一次批评家,请大家不要介意。
1。如果该字符串前部没有空格(或空格串),只有尾部有,那么,if ( tail )这个条件判断就要进行O(n)次,这完全可以用分情况的办法解决,当然,大家会说,如果分情况的话,源代码就不会这么简洁了,那么*copied++ = *str出现过两次,也不简洁,但是效率比提到条件语句外稍高一点。
2。在《如何又简洁又安全地去掉字符串前面和后面的空符号?》中,大家降低时间复杂性的方法是在到达字符串结尾后又折回来。flw兄的是利用了tail变量来记住应该赋'\0'值的位置,但是这样一来,每次都要进行tail = copied; 赋值操作或者是if ( tail )比较+转跳操作,时间复杂性一下子加了一倍,在具有超流水线的机器中效率将会更低。
3。用strlen()或者memmove()的算法实际执行效率可能最高
大家可以试试用for循环来实现strlen()和memmove(),看看运行效率比它们低多少,稍微用心一点的strlen()等函数的实现都会用串处理指令,其运行效率,比用for循环高多了,但是高多少又无法像美国1787年宪法规定的“黑人人口按实际的四分之三折算”那样加以量化,因此是“可能”最高。
请大家多对我的看法提宝贵意见。

论坛徽章:
0
18 [报告]
发表于 2004-03-02 18:05 |只看该作者

【原创】超强版 Trim 横空出世!

tail 用的精妙

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2004-03-02 19:16 |只看该作者

【原创】超强版 Trim 横空出世!

[quote]原帖由 "FH"]这个算法在尾部空格较多时有损失。 [/quote 发表:

有什么损失?这个损失可以避免吗?
要想知道字符串中有没有空格、有多少空格,至少要将字符串扫描一遍,
而我的程序就只扫描了一遍。
我想,还不至于有一种算法可以扫描一半就知道用不用去空格吧?

[quote]原帖由 "FH"]我再给你简化一下,主要是从效率角度考虑[/quote 发表:

你说的“简化”“效率”指的是“尽量少引用指针”吗?
我实在想不通,用 c 来代替 *str 有什么好。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2004-03-02 19:32 |只看该作者

【原创】超强版 Trim 横空出世!

[quote]原帖由 "BingbingNorth"]如果该字符串前部没有空格(或空格串),只有尾部有,那么,if ( tail )这个条件判断就要进行O(n)次,这完全可以用分情况的办法解决[/quote 发表:

请问,如何“分情况”?
咱们先不考虑简洁不简洁的因素,就看效率。

[quote]原帖由 "BingbingNorth"]大家降低时间复杂性的方法是在到达字符串结尾后又折回来。flw兄的是利用了tail变量来记住应该赋'\0'值的位置,但是这样一来,每次都要进行tail = copied[/quote 发表:

这个不然,好象“赋值”运算似乎的确要比“循环碰到结尾再退回来”时的指针“减减”的效率要低些?不过,若是“循环碰到结尾再退回来”,还需要判断循环条件,按照平均情况来考虑,难道一个赋值语句的执行效率尚不如“减减”加上“判断循环条件”两个运算的效率?何况,我又不是每次都要赋值,只是当 *str 所指为“黑字符”时才赋值。卿之所言,甚难服众。

[quote]原帖由 "BingbingNorth"]串处理指令[/quote 发表:

愿闻其详,望不吝赐教!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP