Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1682993
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: C/C++

2010-02-04 13:39:44

 我用课堂练习,用于考查学员的字符串处理的能力.经常会考察这样一道题.假设给你一个字符串,在允许移动字符串首部指针的情况下.请写一个函数,删除首部和尾部的字符串.
 
这里能移动首部指针.表明首部的空格删除只要把字符串的首地址改成第一个非空格字符串即可,可以用下列一个循环得到即到相应的指针.
 
for(p=str; *p==' ' ; p++);
 
这里有点麻烦是删除尾部空格.大部分人的解法是先用strlen求出字符串长度len,然后倒着向前移动第一个非空格字符即可.
 
for(p = str+len-1 ; *p==' ' ; p--);
 
但这个算法问题是strlen本身做了一次字符扫描,然后向前扫描尾部空格又做了一次扫描.这样相当于两次扫描.这样对于超长字符,效率有点低.
 
因此我的要求的解决方法是用一次扫描,直接把尾部空格截掉.基本思路是用一个中间变量 t,记扫描到后部空格的起始位置,如果在后续的扫描碰到非空格字符,则表示这只是字符串中间空格,将t移动到这个字符之后.
 
以下是这个算法执行的结果.在VC++ 6.0和LINUX下编译通过,结果一致
str:"" TRIM ""
str:" " TRIM ""
str:"  " TRIM ""
str:"   " TRIM ""
str:"a" TRIM "a"
str:"abc" TRIM "abc"
str:" abc" TRIM "abc"
str:"   abc   " TRIM "abc"
str:"   abc def" TRIM "abc def"
str:"   abcd  add  ada  " TRIM "abcd  add  ada"
Press any key to continue
 
以下是代码.
 

/*
 * Author: Andrew Huang  * Date: 2010/01/23
 */


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

char * trim_space(char *s )
{
   char *p ;
   char *t ; //指向最后一个非空格字符

   
   //跳过字符串首部空格

   for(; *s==' ' ; s++);
   p = s;
   t = s;
   
   //一次扫描版

   for(; *p != 0 ; p++)
   {
     if(*p !=' ')
        t = p+1;
   }
   
   *t = 0; //截到尾部的空格

   return s;
    
}

void test_trim(char * s)
{
  char buf[1024];
  printf("str:\"%s\" TRIM ",s);
  strcpy(buf,s);
  printf("\"%s\"\n",trim_space(buf));
}

void test1()
{
   test_trim("");
   test_trim(" ");
   test_trim(" ");
   test_trim(" ");
   test_trim("a");
   test_trim("abc");
   test_trim(" abc");
   test_trim(" abc ");
   test_trim(" abc def");
   test_trim(" abcd add ada ");
}

int main()
{
  test1();
}


阅读(2666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~