免费注册 查看新帖 |

Chinaunix

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

[函数] Trim函数的我的版本,欢迎批评指正! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-08 18:48 |只看该作者 |倒序浏览
Trim函数的我的版本,欢迎批评指正!

  1. //用于判断是否是空格类字符的宏
  2. #define isSpaces(ch) (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\b' || ch == '\f' || ch == '\n')

  3. char *Trim(char *pszSource)
  4. {
  5.         //字符串首指针
  6.         char *pszHead = pszSource;
  7.         //用于保存最后非空格类字符的位置的指针
  8.         char *pszLast = &pszSource[strlen(pszSource)-1];
  9.         //查找最后非空格指针的位置
  10.         while (isSpaces(*pszLast))
  11.                 --pszLast;
  12.         *(++pszLast) = '\0';
  13.         //查找首个非空格类字符的位置,以便左移字符串
  14.         for ( ; (*pszHead != '\0') && (pszHead != pszLast); ++pszHead)
  15.         {
  16.                 if (! isSpaces(*pszHead))
  17.                 {
  18.                         strcpy(pszSource, pszHead);
  19.                         break;
  20.                 }
  21.         }

  22.         return pszSource;
  23. }
复制代码


PS: (不好意思,开错了新帖,本想跟帖的,可是不能删除啊)

论坛徽章:
0
2 [报告]
发表于 2004-03-08 19:21 |只看该作者

Trim函数的我的版本,欢迎批评指正!

表面看还不错,象那‘么回事,其实比较一个字符就调用一次函数,是不是很没效率????????   


不好意思,刚才看快了,原来是个宏定义。。。。。。误当成函数调用了。呵呵

论坛徽章:
0
3 [报告]
发表于 2004-03-08 19:26 |只看该作者

Trim函数的我的版本,欢迎批评指正!

程序写的倒是没有什么大的错误,不过在定义Trim函数的时候用函数指针的方式来返回一个地址 这个我到是不赞成. 总体来说写的规规距距
还算不错~~~

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

Trim函数的我的版本,欢迎批评指正!

效率不高,但欣赏char *的返回方式,好想法!

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

Trim函数的我的版本,欢迎批评指正!

一般的程序!

论坛徽章:
0
6 [报告]
发表于 2004-03-09 13:39 |只看该作者

Trim函数的我的版本,欢迎批评指正!

首先声明我不是想说我的代码怎样好,只是想大家持着研究的态度,编写出真正好的一个Trim版本来。说我的代码不好,或者效率不高,请给出您的意见来,而不是简单的下个结论!洗耳恭听!

下面给出测试代码如下,所有代码在Microsoft Visual C++ 6.0,Microsoft Windows 2000 Professional+Service Pack 4环境中测试通过。硬件为:256MB内存+PIV1.6GHz。
在Visual C++ 6.0中全部置为Debug版,不打开优化。

#include <string>;
#include <stdio.h>;
#include <assert.h>;
#include <iostream.h>;
#include <Afxwin.h>;
#include <memory.h>;

void main()
{
        unsigned long i = 0;
        char *pszTemp = new char[30];
        pszTemp[0] = '\0';

        CTime clTimeBegin;
        CTime clTimeEnd;

        clTimeBegin = CTime::GetCurrentTime();
        while (i <= 100000000)
        {
              strcpy(pszTemp, " \t  G O O D  \t  ";
           Trim(pszTemp);
           ++i;
        }
        clTimeEnd = CTime::GetCurrentTime();

        CTimeSpan clTimeSpanConsume = clTimeBegin - clTimeEnd;
        cout<<clTimeSpanConsume.GetTotalSeconds()<<endl;

        delete []pszTemp;
        pszTemp = NULL;
}

下面给出各个Trim函数版本以及所有测试结果(测试多次,取平均值):
1、代码:

  1. void Trim( char *str )
  2. {
  3.         char *copied;
  4.         char *tail;
  5.         char c;

  6.         if ( str == NULL )
  7.                 return;

  8.         for ( copied = str, tail = NULL; ( c = *str ) != 0; str ++ )
  9.         {
  10.                 if ( c != ' ' && c != '\t' )
  11.                 {
  12.                         *copied ++ = c;
  13.                          tail = copied;
  14.                 }
  15.                 else
  16.                 {
  17.                          if ( tail != NULL )
  18.                                  *copied ++ = c;
  19.                 }
  20.         }

  21.         if ( tail != NULL )
  22.              *tail = 0;
  23.         else
  24.              *str = 0;
  25. }
复制代码

运行结果:37(秒)

2、代码:

  1. void Trim( char *str )
  2. {
  3.         char *copied, *tail = NULL;

  4.         if ( str == NULL )
  5.                 return;

  6.         for( copied = str; *str; str++ )
  7.         {
  8.                 if ( *str != ' ' && *str != '\t' )
  9.                 {
  10.                         *copied++ = *str;
  11.                          tail = copied;
  12.                 }
  13.                 else
  14.                 {
  15.                          if ( tail )
  16.                                  *copied++ = *str;
  17.                 }
  18.         }

  19.         if ( tail )
  20.              *tail = 0;
  21.         else
  22.              *copied = 0;

  23.         return;
  24. }
复制代码

运行结果:30(秒)

3、代码:

  1. char *Trim(char *s)
  2. {
  3.         char *search;

  4.         if (s == NULL)
  5.                 return NULL;

  6.         if( *s!='\0' )
  7.         {
  8.                 for(search=s; *search==' '  ||
  9.                                 *search=='\t' ||
  10.                                 *search=='\n' ||
  11.                                 *search=='\r' ||
  12.                                 *search=='\b' ||
  13.                                 *search=='\f'; search++);
  14.                 do {
  15.                         *s++ = *search++;
  16.                 } while (*search != '\0');

  17.                 search = s;

  18.                 for(search--;   *search==' '  ||
  19.                                 *search=='\t' ||
  20.                                 *search=='\n' ||
  21.                                 *search=='\r' ||
  22.                                 *search=='\b' ||
  23.                                 *search=='\f'; search--);
  24.                 search++;
  25.                 *search='\0' ;
  26.         }

  27.         return s;
  28. }
复制代码

运行结果:27(秒)

4、代码:

  1. //用于判断是否是空格类字符的宏
  2. #define isSpaces(ch) (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\b' || ch == '\f' || ch == '\n')

  3. char *Trim(char *pszSource)
  4. {
  5.         //字符串首指针
  6.         char *pszHead = pszSource;
  7.         //用于保存最后非空格类字符的位置的指针
  8.         char *pszLast = &pszSource[strlen(pszSource)-1];
  9.         //查找最后非空格指针的位置
  10.         while (isSpaces(*pszLast))
  11.                 --pszLast;
  12.         *(++pszLast) = '\0';
  13.         //查找首个非空格类字符的位置,以便左移字符串
  14.         for ( ; (*pszHead != '\0') && (pszHead != pszLast); ++pszHead)
  15.         {
  16.                 if (! isSpaces(*pszHead))
  17.                 {
  18.                         strcpy(pszSource, pszHead);
  19.                         break;
  20.                 }
  21.         }

  22.         return pszSource;
  23. }
复制代码

运行结果:25(秒)

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

Trim函数的我的版本,欢迎批评指正!

那你试试这个,在你的基础上改的。

  1. //用于判断是否是空格类字符的宏
  2. #define isSpaces(ch) (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\b' || ch == '\f' || ch == '\n')

  3. char *Trim(char *pszSource)
  4. {
  5.    //字符串首指针
  6.    char *pszHead = pszSource;
  7.    //用于保存最后非空格类字符的位置的指针
  8.    char *pszLast = &pszSource[strlen(pszSource)-1];
  9.    //查找最后非空格指针的位置
  10.    while (isSpaces(*pszLast))
  11.       --pszLast;
  12.    *(++pszLast) = '\0';
  13.    //查找首个非空格类字符的位置,以便左移字符串
  14.    for ( ; (*pszHead != '\0'); ++pszHead)
  15.    {
  16.       if (! isSpaces(*pszHead))
  17.       {
  18.          break;
  19.       }
  20.    }
  21.    if ( pszSource != pszHead )
  22.       strcpy(pszSource, pszHead);

  23.    return pszSource;
  24. }
复制代码

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

Trim函数的我的版本,欢迎批评指正!

到现在为止,就这一问题我贴的程序都是我在原来的基础上改的,都不是我自己的Trim函数。
我自己用的,至少会用memcpy代替strcpy的,因为memcpy是基于串操作指令的。

在我刚修改的程序里,又多了一个判断,也许有人又会因为多了一个判断而说降低效率了。
测试代码的不同,得到的测试结果也不同,谁会按照正态分布去构造测试数据呢?大家脑子里有个概念就行了。

论坛徽章:
0
9 [报告]
发表于 2004-03-09 14:24 |只看该作者

Trim函数的我的版本,欢迎批评指正!

原帖由 "无虚士" 发表:
程序写的倒是没有什么大的错误,不过在定义Trim函数的时候用函数指针的方式来返回一个地址 这个我到是不赞成. 总体来说写的规规距距
还算不错~~~


任何事物都自有它存在的道理,往往不倚赖于个人的喜好。比如在这里你不赞成函数返回地址值,那是因为你还没有认识到它这样存在的道理。如果你知道了这一层道理,相信你会改变观点的:为什么函数不返回地址呢?不返回地址反而没有道理了。

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

Trim函数的我的版本,欢迎批评指正!

FH 兄:
我觉得strcpy的用法存在移植性问题,查联机帮助,说strcpy(str1, str2)在出现地址重叠时,str1在左,str2在右没有问题,但是ansi c 99规范中指出“如果str1和str2重叠,则strcpy()的特性无定义”
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP