Chinaunix

标题: trim.c 自认为很高效 [打印本页]

作者: sulilo    时间: 2012-04-26 18:15
标题: trim.c 自认为很高效
在抽取网页数据的时候,需要用到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. }
复制代码

作者: GFree_Wind    时间: 2012-04-26 21:29
我来拍砖,别的不说。
把i和j当作char *指针来用的,就让人看着别扭。
作者: enough_zerg    时间: 2012-04-27 10:03
....这个那么多重循环再判断....
作者: Sevk    时间: 2012-04-27 14:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: wwwsq    时间: 2012-04-27 15:34
代码风格不够好。八个空格缩进,还缩进那么多层。一下就震惊了。
作者: 雨过白鹭洲    时间: 2012-04-27 16:33
你能trim几个字符串啊,高效不高效有什么用。。

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

作者: 放纵思想    时间: 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);
        
}
作者: 放纵思想    时间: 2012-04-27 18:33
判断空白字符,难道你不知道这个函数吗?

int isspace(int c);
作者: txdgtwpv    时间: 2012-04-27 19:47
lz用的拼音输入法?


自认为很gaoxiao
            ----------  
            | 1. 高效    2.搞笑       3.高校 |
作者: nizvoo    时间: 2012-04-28 09:18
:wink::wink::wink::wink:
作者: 251316192    时间: 2012-04-28 09:31
看到你用i, j来标识指针。我都不知道要做什么了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2