免费注册 查看新帖 |

Chinaunix

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

如何又简洁又安全地去掉字符串前面和后面的空符号?  关闭 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2004-02-15 20:06 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

我的算法,应该是比较简洁的吧,大家给点意见

void kill_space( char *str)
{
      int i, j;

      assert( str != NULL);

      /*find the first non-space char's position */
      for (i = 0; (str == ' ' || str == '\t') && str != '\0'; i++)
          ;
      /*find the last non-space char's position */
      for (j = strlen(str) - 1; (str[j] == ' ' || str[j] == '\t') && j; j--)
          ;
      memmove(str, str + i, j - i);
      str[j + 1] = '\0';
}

论坛徽章:
0
42 [报告]
发表于 2004-02-15 20:52 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

这个帖子又被顶上来了,我发表一下关于“效率最高”的拙见,不足之处请大家补充。
1。如果前面没有空白符,那么str[i]=str[i]这样的操作不应该被执行,否则,对于一个很大的字符串,你的算法的时间复杂性比最佳的就低很多。大家可以看看前面的帖子,这一点有谁考虑到了。
2。用了strlen()的算法一定不是最佳的,因为这个程序的算法可以降到strlen(str)+1,而strlen()本身的时间复杂性就是strlen(str)+1。
3。只爱一点点兄发表于: 2003-12-25 12:12 的算法,bjf兄 发表于: 2003-12-26 20:12    的时间复杂性是最小的,(只比strlen(str)+1大了一点点)但还没有达到最佳,在到达字符串结尾后又折回来了。
另外我还要感谢converse兄,教给了我memmove()的用法。

论坛徽章:
0
43 [报告]
发表于 2004-02-15 22:33 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

在写上面的代码前,没有看过前面的留言,原来可以不用strlen呀,所以我又进行了一个改进,大家再看一看吧


  1. void kill_space(char *str)
  2. {
  3.       char *p, *q;

  4.       assert(str != NULL);

  5.       for (p = str; (*p == ' ' || *p == '\t') && *p != '\0'; p++)
  6.           ;
  7.       for (q = p; *q != ' ' && *q != '\t' && *q != '\0'; q++)
  8.           ;
  9.       *q = '\0';
  10.       memmove(str, p, q - p);
  11. }
复制代码


BingbingNorth:
我现在写程序的时候,首先考虑的是标准库里有没有相应功能的函数,这样可以保证移植性,我也是最近开始仔细研究C库的,过一段时间(大概一个月吧),我会把自己实现的部分C库(主要是string.h,input/output,stdlib.h)的代码放在这里和大家讨论。
另外,谁能告诉我哪里能找到C库的实现,我听说好像LINUX里有,不知道是不是呢

论坛徽章:
0
44 [报告]
发表于 2004-02-15 22:44 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

在写上面的代码前,没有看过前面的留言,原来可以不用strlen呀,所以我又进行了一个改进,大家再看一看吧


  1. void kill_space(char *str)
  2. {
  3. char *p, *q;

  4. assert(str != NULL);

  5. for (p = str; (*p == ' ' || *p == '\t') && *p != '\0'; p++)
  6. ;
  7. for (q = p; *q != ' ' && *q != '\t' && *q != '\0'; q++)
  8. ;
  9. *q = '\0';
  10. memmove(str, p, q - p);
  11. }
复制代码


BingbingNorth:
我现在写程序的时候,首先考虑的是标准库里有没有相应功能的函数,这样可以保证移植性,我也是最近开始仔细研究C库的,过一段时间(大概一个月吧),我会把自己实现的部分C库(主要是string.h,input/output,stdlib.h)的代码放在这里和大家讨论。
另外,谁能告诉我哪里能找到C库的实现,我听说好像LINUX里有,不知道是不是呢

论坛徽章:
0
45 [报告]
发表于 2004-02-16 15:00 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

converse兄:
你的算法不太符合原来的要求,字符串中间的空白符是不能删的。

论坛徽章:
0
46 [报告]
发表于 2004-02-16 15:41 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

个人认为,由于中间空格的存在,strlen 一下是无法避免的

论坛徽章:
0
47 [报告]
发表于 2004-02-16 17:49 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

BingbingNorth:
我昨晚回去睡觉的时候也反应过来了,不过今天上班,不太有时间想,我暂时也想不到一个比较好的小于(或接近)strlen(s)-1的方法找到后面空格的位置,待我想一想。

论坛徽章:
0
48 [报告]
发表于 2004-02-17 01:11 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

char *
kill_space(char *ptr)
{
        int i=0,j;
        char *str;
       
        j=strlen(ptr)-1;
        while(ptr=='\t'||ptr==' '||ptr=='\n') i++;
        while(ptr[j]=='\t'||ptr[j]==' '||ptr[j]=='\n') j--;
       
        if((str=(char *)malloc(j-i+2))==NULL)
        {
                perror("kill_space:malloc";
                exit(1);
        }
        strncpy(str,ptr+i,j-i+1);
        str[j-i+1]='\0';
        return str;
}

楼主应当把函数接口改掉,如双指针,否则不可能成功。

论坛徽章:
0
49 [报告]
发表于 2004-02-17 10:53 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

关注这个帖子的同仁,也可以看一看wangrujun兄发的一个有关算法的帖子,主题为“[原创] 从字符串中,删除指定字符串中的任意字符”,有一定的相似之处。

论坛徽章:
0
50 [报告]
发表于 2004-02-21 13:22 |只看该作者

如何又简洁又安全地去掉字符串前面和后面的空符号?

不考虑memmove的复杂度后复杂度为strlen(s),大家看看算法有没有问题
void KillSpace(char*ptr)
{
    int begin=-1, end=0, curpos=0;

    while(0 != ptr[curpos])
    {
        if((' ' == ptr[curpos]) || ('\t' == ptr[curpos]))
        {
            //do nothing
        }
        else
        {
            //find out the first byte not space
            if(-1 == begin)
                begin = curpos;

            //current the last byte not space
            end = curpos;
        }
        curpos++;
    }
     ptr[end+1] = 0;

    if(-1 == begin)
        //only space and tab in ptr
        ptr[0] = 0;
    else if(0 != begin)
        memmove(ptr, &ptr[begin], end-begin+1);
}

这是借鉴了楼上各位兄台的思路后得出的算法,尤其是BingbingNorth的“如果前面没有空白符”的提醒。
不过我还有个疑问,这样去空格会不会造成内存泄漏?去掉的空格的内存空间并没有真正的释放掉,但直接用free似乎不妥。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP