免费注册 查看新帖 |

Chinaunix

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

[函数] 使用标准库函数的Trim [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-09-23 02:01 |只看该作者
俺胡老师给俺一段代码,据说能看出你的函数的BUG,你先试试

  1. /*
  2. * Remove any tabs and spaces from the begining and the end of
  3. * a string
  4. */
  5. char* trim(char* _s)
  6. {
  7.         int len;
  8.         char* end;

  9.              /* Null pointer, there is nothing to do */
  10.         if (!_s) return _s;

  11.              /* Remove spaces and tabs from the begining of string */
  12.         while ((*_s == ' ') || (*_s == '\t')) _s++;

  13.         len = strlen(_s);

  14.         end = _s + len - 1;

  15.              /* Remove trailing spaces and tabs */
  16.         while ((*end == ' ') || (*end == '\t')) end--;
  17.         if (end != (_s + len - 1)) {
  18.                 *(end+1) = '\0';
  19.         }

  20.         return _s;
  21. }

  22. struct foxbase
  23. {
  24.         char a[4];
  25.         char b[4];
  26. };

  27. int main( int argc, char* argv[] )
  28. {
  29.         struct foxbase t;
  30.         bzero( &t, sizeof( t ) );
  31.         strcpy( t.a, "\t\t\t\t" );

  32.         cout << "(" << t.a << ")" << endl;
  33.         trim( t.b );
  34.         cout << "(" << t.a << ")" << endl;

  35.         return 0;
  36. }
复制代码

论坛徽章:
0
22 [报告]
发表于 2006-09-23 14:31 |只看该作者
俺胡老师还说,
要是你看出错误了,就把那个函数打印出来烧掉,把纸灰调碗水喝下去,以后就不会犯同样的错误了。
要是还看不出错误,就跟俺一起学foxbase得了

论坛徽章:
0
23 [报告]
发表于 2006-09-24 13:06 |只看该作者
胡老师?狐老师?哈哈

论坛徽章:
0
24 [报告]
发表于 2006-09-24 14:07 |只看该作者
哈哈,字符串操作是蛮有意思的,我也经常喜欢  *s++ = *++p; 之类的字符拷贝用法 ...

下面我再贴一个稍改的, 前面贴的 mysql 那个确实是有bug的, 但不是什么致使缺陷就是了.  if(*_s) 就是防止 _s 已经是空串导致 end[-1]出错或不合法.

  1. char *trim(char *_s)
  2. {
  3.   if (_s)
  4.   {
  5.     while ((*_s == ' ') || (*_s == '\t')) _s++;
  6.     if (*_s)
  7.     {
  8.       char *end = _s + strlen(_s);
  9.       while (end[-1] == ' ' || end[-1] == '\t') end--;
  10.       *end = '\0';
  11.     }
  12.   }
  13.   return _s;
  14. }
复制代码
sjlee0626 该用户已被删除
25 [报告]
发表于 2009-03-12 10:11 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
26 [报告]
发表于 2009-03-12 23:14 |只看该作者

  1. char* my_trimrl(char* pstr)
  2. {
  3.     char* lpos;
  4.     char* rpos;
  5.        
  6.     if(pstr==NULL) return NULL;
  7.        
  8.     lpos = pstr;
  9.     while(isspace(*lpos)) ++lpos;
  10.     rpos = lpos+strlen(lpos)-1;
  11.     while(rpos>=lpos&&isspace(*rpos)) --rpos;
  12.     *(rpos+1) = '\0';
  13.     if(pstr!=lpos) memmove(pstr, lpos, 2+rpos-lpos);
  14.     return pstr;
  15. }
复制代码

写起来思路都差不多的样子。真要认真起来的话怕是大家会写成一样的了。没测试,写着玩的。
翻以前的旧贴,就发现大家都还在不断地重新发明轮子。
最后要有memmove之类的东西。要符合大家的使用习惯。
-------------------------------------------------
原来是挖坟贴。不好意思。请无视掉

[ 本帖最后由 xie995 于 2009-3-12 23:37 编辑 ]

论坛徽章:
0
27 [报告]
发表于 2010-10-22 12:12 |只看该作者
发现楼主的TRIM函数只能TRIM空格,回换换行等几个字符. 我需要一个能TRIM所有前导(leading)或拖尾(Trailing)的0x00到0x20(ascii码在0至32,即NULL至SPACE)所有字符的一个TRIM函数,请问如何修改?

论坛徽章:
0
28 [报告]
发表于 2010-11-02 16:38 |只看该作者
貌似无法正确TRIM多字节字符,如中文啊.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP