免费注册 查看新帖 |

Chinaunix

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

trim.c 自认为很高效 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-26 18:15 |只看该作者 |倒序浏览
在抽取网页数据的时候,需要用到trim, 一高兴自己写了个。

设计思路:
1. 如果行首没有' ', '\t', '\r', '\n', 这些字符, 则向后移动到行尾,
2. 如果行首包含以上字符,则使用后面的字符去覆盖前面的字符。
3. 循环完成后,再从后向前清除行尾的字符。
  1. /*
  2. * Trim String
  3. */
  4. #include <stdio.h>
  5. #include <unistd.h>

  6. #include <string.h>


  7. inline int _trim_isprint(char c)
  8. {
  9.         switch (c) {
  10.                 case ' ':
  11.                         return 1;
  12.                 case '\t':
  13.                         return 1;
  14.                 case '\r':
  15.                         return 1;
  16.                 case '\n':
  17.                         return 1;
  18.                 default:
  19.                         return 0;
  20.         }
  21. }



  22. void trim(char *str)
  23. {

  24.         char *i;
  25.         char *j;

  26.         if (str != NULL) {
  27.        
  28.                 i = str;
  29.                 for (j=i; *j; j++) {
  30.                         if (i == str) {
  31.                                 if (!_trim_isprint(*j)) {
  32.                                         *i++ = *j;                        /* 找到第一个可打印字符         */
  33.                                 }
  34.                         } else {
  35.                                 if (i == j) {
  36.                                         i++;                                /* i, j 在相同的位置, i++        */
  37.                                 } else {
  38.                                         *i++ = *j;                        /* 复制字符j, 到字符i                */
  39.                                 }
  40.                         }
  41.                 }
  42.                

  43.                 /* 清除行尾的非打印字符 */
  44.                 if (i != str) {
  45.                         while (_trim_isprint(*(i-1))) {
  46.                                 i--;
  47.                         }
  48.                 }

  49.                 *i = '\0';
  50.         }
  51. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-04-26 21:29 |只看该作者
我来拍砖,别的不说。
把i和j当作char *指针来用的,就让人看着别扭。

论坛徽章:
0
3 [报告]
发表于 2012-04-27 10:03 |只看该作者
....这个那么多重循环再判断....

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
4 [报告]
发表于 2012-04-27 14:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2012-04-27 15:34 |只看该作者
代码风格不够好。八个空格缩进,还缩进那么多层。一下就震惊了。

论坛徽章:
0
6 [报告]
发表于 2012-04-27 16:33 |只看该作者
你能trim几个字符串啊,高效不高效有什么用。。

你想想一个程序员每天也就能写几十行代码,就算100行吧,你写了个trim,一天的工作量啊,重复写这个能有什么意思,写一万遍,还能写出个花来?

论坛徽章:
1
摩羯座
日期:2013-11-14 15:56:09
7 [报告]
发表于 2012-04-27 18:32 |只看该作者
void trim( char *str )
{

        if ( str == NULL )        return;

        char *src = str;

        char *begin = NULL, *end = NULL;

        for(begin = str; *str==' '; ++str, ++begin)
                ;
        for(end = str; *str; ++str)
                if(*str != ' ') end = str;

        *(end + 1) = 0;

        memmove(src, begin, end-begin+2);
        
}

论坛徽章:
1
摩羯座
日期:2013-11-14 15:56:09
8 [报告]
发表于 2012-04-27 18:33 |只看该作者
判断空白字符,难道你不知道这个函数吗?

int isspace(int c);

论坛徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亚洲杯之乌兹别克斯坦
日期:2015-02-10 11:32:25
9 [报告]
发表于 2012-04-27 19:47 |只看该作者
lz用的拼音输入法?


自认为很gaoxiao
            ----------  
            | 1. 高效    2.搞笑       3.高校 |

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
10 [报告]
发表于 2012-04-28 09:18 |只看该作者
:wink::wink::wink::wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP