免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-09 19:56 |只看该作者 |倒序浏览
以下是本人使用标准库函数构造的Trim,本人对其在Linux下的表现非常满意!贴出来供各位比较测试。
  1. #include        <string.h>;
  2. #include        <memory.h>;

  3. #define        ISSPACE(x)        ((x)==' '||(x)=='\r'||(x)=='\n'||(x)=='\f'||(x)=='\b'||(x)=='\t')

  4. char        *Trim( char *String )
  5. {
  6.         char        *Tail, *Head;

  7.         for ( Tail = String + strlen( String ) - 1; Tail >;= String; Tail -- )
  8.                 if ( !ISSPACE( *Tail ) )
  9.                         break;
  10.         Tail[1] = 0;
  11.         for ( Head = String; Head <= Tail; Head ++ )
  12.                 if ( !ISSPACE( *Head ) )
  13.                         break;
  14.         if ( Head != String )
  15.                 memcpy( String, Head, ( Tail - Head + 2 ) * sizeof( char ) );
  16.         return String;
  17. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2004-03-09 20:11 |只看该作者

使用标准库函数的Trim

好像和flw很久以前写的一个很象

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-03-09 20:17 |只看该作者

使用标准库函数的Trim

是不是我的测试程序有问题呀,结果不正确。


  1. int
  2. main(void)
  3. {
  4.         char *str = (char *)malloc(100);
  5.         strcpy(str, "    dgf ");
  6.         char *p;
  7.         p = Trim(str);
  8.         printf("%s\n", p);
  9.         return 0;
  10. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2004-03-09 22:36 |只看该作者

使用标准库函数的Trim

[quote]原帖由 "火柴"]好像和flw很久以前写的一个很象[/quote 发表:

与flw程序的相同点是:都注重用最少的变量来实现代码。区别是flw不使用一切函数调用,缺点是有时效率太低(如对字符串后面有很多空格的情况)。FH的程序有函数调用(仅有一次调用strlen()用以统计字符个数),但是不作无谓的多余的字符比较和拷贝操作,这样节省下来的时间一般足以弥补函数调用的时间开销(即总体上:额外多个空格字符的比较和拷贝时间 >; 一次函数调用的额外开销(如参数入栈等)+统计字符个数(也是一种字符比较运算)所需的时间),因此整体上执行效率(平均执行效率)很高。

论坛徽章:
0
5 [报告]
发表于 2004-03-10 09:56 |只看该作者

使用标准库函数的Trim

[quote]原帖由 "lenovo"][/quote 发表:

对不起,我在ISSPACE中少判断了空格。已经改正。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2004-03-10 10:07 |只看该作者

使用标准库函数的Trim

我测试的基本都是这样:
real    0m0.00s
user    0m0.00s
sys     0m0.00s

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

使用标准库函数的Trim

原帖由 "lenovo" 发表:
我测试的基本都是这样:
real    0m0.00s
user    0m0.00s
sys     0m0.00s

循环一千万次,差别是分级和秒级。

论坛徽章:
0
8 [报告]
发表于 2004-03-10 10:33 |只看该作者

使用标准库函数的Trim

更多情况下我们需要把"   key    =  value    "转化成"key=value",这样的函数不知道各位有什么妙招没有.

论坛徽章:
0
9 [报告]
发表于 2004-03-10 21:44 |只看该作者

使用标准库函数的Trim

原帖由 "whyglinux" 发表:

与flw程序的相同点是:都注重用最少的变量来实现代码。区别是flw不使用一切函数调用,缺点是有时效率太低(如对字符串后面有很多空格的情况)。FH的程序有函数调用(仅有一次调用strlen()用以统计字符个数),但是?.........


我说的不是那个,是去年讨论(也好像是讨论去空格的函数)时写的一个,很久了,流程基本上是一样的,只是没用memcpy

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

使用标准库函数的Trim

[quote]原帖由 "火柴"]我说的不是那个,是去年讨论(也好像是讨论去空格的函数)时写的一个,很久了,流程基本上是一样的,只是没用memcpy[/quote 发表:

是有这么一个程序,谢谢火柴还记得它。

关于 Trim,我只写过两个程序,一个就是前几天写的,主要觉得太精炼了,变量少、循环少,而且和别人的思路都不同,可谓是前所未有,所以就贴出来了。

另一个,则就是火柴说的这个,去年的时候写的,主要思路是“从前往后数掉前面的空格”,再“从后往前数掉后面的空格”,等“数”出了实际有效的第一个字符和最后一个字符之后,再用 strcpy 或者 memcpy 拷贝过去。

事实上,Trim 从算法上来讲,也就这两个思路,大多数人采用的是后面的这个思路,好像依赖于 strlen、memcpy 等库函数的效率后,反而要更快些。
而我的那个思路,似乎没有多少人去想,结果就吃亏在“效率”问题上了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP