免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
71 [报告]
发表于 2006-03-18 19:43 |只看该作者

回复 1楼 flw 的帖子

对const char *或const char * const类型的调用就是调用者的问题了。

[ 本帖最后由 devia 于 2006-3-18 20:17 编辑 ]

论坛徽章:
0
72 [报告]
发表于 2006-03-18 21:40 |只看该作者
偶喜欢写最简单的...
char* trim(char* str)
{
  char *start, *end;
  
  for(start = str; *start; start++)
  {
    if (*start!=' ')
      break;
  }
  
  for(end = start; *end; end++);
  for(; *(end-1)!=' '
  {
    end--;
    end = 0;
  }
  //好象可以合起来? for(;*(end-1)!=' ';--end=0); try
  return start;
}

[ 本帖最后由 Yarco 于 2006-3-18 21:45 编辑 ]

论坛徽章:
0
73 [报告]
发表于 2006-03-19 03:25 |只看该作者
不知道这个如何

void trim( char *str )
{
    char *s=str, *e=str, p;
    while((*s=='\t') || (*s==' ') ) s++;
    while(p = *str++ = *s++ )
        if( (p!=' ') && (p!='\t') )
            e=str;
    *e = '\0';  
}

论坛徽章:
0
74 [报告]
发表于 2006-03-19 08:11 |只看该作者
楼主的程序在复制每一个字符时都要做至少一个比较,我觉得性能应该不如先确定两头,然后复制中间的算法

论坛徽章:
0
75 [报告]
发表于 2006-03-19 10:31 |只看该作者

俺也来贴一个,稍微改改,就可以去处space,'\n'等等,或者改为trimleft,trimright

extern char * trim(char *s)
{
   int first=0;
   int len;
   int i;
   char *p = s;
   
   if (s == (char *)0) return;

   len = strlen((char *) s);

   {
      while (first<len) {
         if (!isspace((unsigned char)s[first]))
            break;
         first++;
      }
   }

   if (first>=len) {
      *s = '\0';
      return p;
   }
   else
      memmove((char *) s, (char *) s+first, strlen(s+first)+1);

   for (i=(int)strlen((char *) s)-1; i >= 0; i--)
      if (!isspace((unsigned char)s[i])) {
         s[i+1] = '\0';
         return p;
      }
   if (i<0) *s = '\0';
   return p;
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
76 [报告]
发表于 2006-03-19 12:17 |只看该作者
原帖由 xiaonanln 于 2006-3-19 08:11 发表
楼主的程序在复制每一个字符时都要做至少一个比较,我觉得性能应该不如先确定两头,然后复制中间的算法

问题是,什么叫“两头”?你怎么知道“两头”?

论坛徽章:
0
77 [报告]
发表于 2006-03-19 12:32 |只看该作者
在寻找‘两头’的过程中是需要付出代价的
俺盯着LZ的程序看老半天了始终看不懂
惭愧了我!!!
太缺乏理解别人程序的能力
同事说我好多次了


BTW
两年前的帖都翻出来啦
这个帖子的帖龄比不少人的CU龄都长



总算看懂
确实经典

[ 本帖最后由 bleem1998 于 2006-3-19 12:51 编辑 ]

论坛徽章:
0
78 [报告]
发表于 2006-03-19 16:51 |只看该作者
如果是自己封装过的特殊字符串
比如用一个变量记录字符串的长度,并且动态改变
先确定两头 然后memmove倒是不错的

论坛徽章:
0
79 [报告]
发表于 2006-03-19 19:02 |只看该作者
不记得在那看到的,下面的代码还不错,更具通用性吧!

char * trim(char *p, const char *delim)
{
    int len;
    len = strlen(p);
    while ( (len > 0) && strchr(delim, p[len - 1] ) ) {
        p[len - 1] = '\0';
        len--;
    }
    while ( (*p)&&(strchr(delim,*p)) ) p++;

    return(p);
}

论坛徽章:
0
80 [报告]
发表于 2006-03-19 23:22 |只看该作者
太棒了
感觉要是于优化的话还有一个地方:
if ( tail )
这在第一次对tail进行赋值后直到循环结束就一直为真,是不是可以在这个判断上优化一下,当处理字符串后面的空白时可以减少一些比较,不知道这样对不对
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP