Chinaunix首页 | 论坛 | 博客
  • 博客访问: 570823
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2010-05-18 11:14:48

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://sharep.blog.51cto.com/539048/296512
好久没写东西了。最近在做一个unix下的网络服务器项目,用c写的,其中有个地方需要用到c++中的trim()函数,c中没有。我在unix论坛上找了几个帖子,对我启发挺大,但好像性能没有达到最优,于是自己又写了个。
源程序代码如下:
char * trim(char *str)
{
    char *str_last,*str_cur;
    if(str==NULL)
        return;
    for(;*str==0x20 || *str=='\t'; ++str);
    for(str_last=str_cur=str;*str_cur!='\0';++str_cur)
        if(*str_cur!=0x20&&*str_cur!='\t')
            str_last=str_cur;
    *++str_last=0;
    return str;
}

函数将破坏原来字符串,目标字符串在返回值中
这个实现只需要对字符串遍历一遍,性能可以说是n的。
另外这里有个意外收获,分享给大家:
1.如果想不改变原来的字符串,函数必须新增参数存储新的字符串首地址
2.对同一个函数,在不同的编译器环境下,会有很大的不同。
对于调用
int main(int argc,char * argv[])
{
    char str1[]="   abc   def   ";
    char *str2="   123   456   ";
    char * trimed;
    trimed=trim(str1);
    trimed=trim(str2);
}
对于gcc来说:
"   123   456   "是全局串常量, GCC放到保护地址,不许改动. 一动就CPU保护.
"   abc   def   "乃栈常量,无保护.
所以在linux下用gcc编译没有错误,运行时trim(str2);会有段错误。

而用VC没有问题, 用TC也没有问题.

所以,在用gcc做编译器的环境下,如果想用trim的话,初始化字符串一定不能用第二个方法。。。也就是说,我们不能改变str2指向的地址的内容。当然,我们可以不改变str2的值,新声明一个char * 就好了,这样需要为trim新增一个参数,就像strcpy一样。
可是这里的常量字符串只是测试之用,谁会闲着没事初始化一个有空白字符的字符串然后再去trim呢。。。
所以,此函数可用。。。参考文章
如果哪位大侠有更好的算法,记得给我留言阿。
阅读(710) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~