免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
81 [报告]
发表于 2006-03-22 20:00 |只看该作者
不知道我这个段代码怎么样:
trim( char *s )
{
        char *p=s;

        while (*p) p++;
        while (p>s && ( (*(p-1)==' ') || *(p-1)=='\n' ) ) p--;
        *p='\0';
}

论坛徽章:
0
82 [报告]
发表于 2006-03-25 22:23 |只看该作者
原帖由 handsome-king 于 2006-3-22 20:00 发表
不知道我这个段代码怎么样:
trim( char *s )
{
        char *p=s;

        while (*p) p++;
        while (p>s && ( (*(p-1)==' ') || *(p-1)=='\n' ) ) p--;
        *p='\0';
}


好像在最好的情况下也只能去掉串后面跟着的空白,一般情况下(开头有空白)那么最后什么都没有了,串被赋值成'\0'了

论坛徽章:
0
83 [报告]
发表于 2006-06-20 21:39 |只看该作者

我的这个应该是很快的。哈哈哈。。

void trim2(char *str)
{
    char *be, *end, *p;
    int i = 1;
    be = end = NULL;
    for(p = str;*p;p++)
    {
        if(*p != ' ' && *p != '\t')
        {
                if(i == 1)
                {
                  be = p;        // begin
                }
                end = p;         // end
                i++;
        }
    }
    memcpy(str,be,end-be+1);
    *(str+(end-be+1)) = 0;
}

论坛徽章:
0
84 [报告]
发表于 2006-06-20 21:44 |只看该作者

上面的没有进行错误的检查

void trim2(char *str)
{
    char *be, *end, *p;
    int i = 1;
    if(str == NULL)
        return;
    be = end = NULL;
    for(p = str;*p;p++)
    {
        if(*p != ' ' && *p != '\t')
        {
                if(i == 1)
                {
                  be = p;        // begin
                }
                end = p;         // end
                i++;
        }
    }
    memcpy(str,be,end-be+1);
    *(str+(end-be+1)) = 0;
   
    return;
}

这个是进行输入参数错误检查的。

论坛徽章:
0
85 [报告]
发表于 2006-06-20 21:47 |只看该作者
原帖由 MackedNice 于 2006-6-20 21:39 发表
void trim2(char *str)
{
    char *be, *end, *p;
    int i = 1;
    be = end = NULL;
    for(p = str;*p;p++)
    {
        if(*p != ' ' && *p != '\t')
        {
                if(i ...



你的函数既不能完成任务,又不快

已收回这句话,不好意思地说!

[ 本帖最后由 mik 于 2006-6-21 00:04 编辑 ]

论坛徽章:
0
86 [报告]
发表于 2006-06-20 21:59 |只看该作者
谁说的。我测试过的。。
为什么这么说?

论坛徽章:
0
87 [报告]
发表于 2006-06-20 22:03 |只看该作者

这是我测试的程序在dev-c++编译通过。。

#include <stdio.h>
#include <string.h>
#include <memory.h>

void trim1( char *str )
{
        char *copied, *tail = NULL;

        if ( str == NULL )
                return;

        for( copied = str; *str; str++ )
        {
                if ( *str != ' ' && *str != '\t' )
                {
                        *copied++ = *str;
                         tail = copied;
                }
                else
                {
                         if ( tail )
                                 *copied++ = *str;
                }
        }

        if ( tail )
             *tail = 0;
        else
             *copied = 0;

        return;
}
void trim2(char *str)
{
    char *be, *end, *p;
    int i = 1;
    if(str == NULL)
        return;
    be = end = NULL;
    for(p = str;*p;p++)
    {
        if(*p != ' ' && *p != '\t')
        {
                if(i == 1)
                {
                  be = p;        // begin
                }
                end = p;         // end
                i++;
        }
    }
    memcpy(str,be,end-be+1);
    *(str+(end-be+1)) = 0;
   
    return;
}

int main()
{
    char buff[50];
    char buff1[50];
    char *p = "    AAAA  BB      ";
    strcpy(buff,p);
    strcpy(buff1,p);
    printf("before buffer = [%s]\n",buff);
    trim1(buff);
    printf("after buffer = [%s]\n",buff);
    printf("before buffer1 = [%s]\n",buff1);
    trim2(buff1);
    printf("after buffer1 = [%s]\n",buff1);
   
    return 0;
}

论坛徽章:
0
88 [报告]
发表于 2006-06-20 23:01 |只看该作者
原帖由 MackedNice 于 2006-6-20 21:59 发表
谁说的。我测试过的。。
为什么这么说?



不好意思,你的代码是对的,我改正! 我没仔细看lz的贴子,

你的代码也不错啦!

[ 本帖最后由 mik 于 2006-6-21 00:00 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
89 [报告]
发表于 2006-06-21 08:20 |只看该作者
其实就这个问题来讲,57 楼之前已经把所有的细节都讨论清楚了,
当然了,这主要是因为这个帖子发表的时候,
前面还有几篇帖子已经较深入地讨论过这个问题了。

从 57 楼开始,水平就直接下降。
很多人开始讨论一楼的函数是否正确,再或者莫名其妙地附上自己的程序(不知目的何在?)
基本上可以说,从 57 楼开始,这个帖子就只剩下娱乐意义,而失去学术意义了。

论坛徽章:
0
90 [报告]
发表于 2006-06-21 09:03 |只看该作者
不好意思。。
是昨天刚看到这帖子
觉得很不错的一个帖子。
所以就试着写了一下。
没有想到楼主的感觉。
向你道歉了。

没有什么目的,也不是为了娱乐。
就是跟大家。交流一下而已。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP