好久没写东西了。最近在做一个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呢。。。
所以,此函数可用。。。参考文章http://bbs.chinaunix.net/thread-230114-1-1.html
如果哪位大侠有更好的算法,记得给我留言阿。