织梦CMS - 轻松建站从此开始!

罗索

C语言测试.一次扫描的删除尾部空格代码

jackyhwei 发布于 2010-11-04 11:25 点击:次 
课堂练习,用于考查学员的字符串处理的能力.经常会考察这样一道题.假设给你一个字符串,在允许移动字符串首部指针的情况下.请写一个函数,删除首部和尾部的字符串.
TAG:

我用课堂练习,用于考查学员的字符串处理的能力.经常会考察这样一道题.假设给你一个字符串,在允许移动字符串首部指针的情况下.请写一个函数,删除首部和尾部的字符串.
 
这里能移动首部指针.表明首部的空格删除只要把字符串的首地址改成第一个非空格字符串即可,可以用下列一个循环得到即到相应的指针.
 
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
 
以下是代码.

  1. /* 
  2.  * Author: Andrew Huang <bluedrum@163.com 
  3.  * Date: 2010/01/23 
  4.  */ 
  5.  
  6. #include <stdio.h> 
  7. #include <stdlib.h> 
  8. #include <string.h> 
  9.  
  10. char * trim_space(char *s ) 
  11.    char *p ; 
  12.    char *t ; //指向最后一个非空格字符 
  13.  
  14.    
  15.    //跳过字符串首部空格 
  16.  
  17.    for(; *s==' ' ; s++); 
  18.    p = s; 
  19.    t = s; 
  20.    
  21.    //一次扫描版 
  22.  
  23.    for(; *p != 0 ; p++) 
  24.    { 
  25.      if(*p !=' '
  26.         t = p+1; 
  27.    } 
  28.    
  29.    *t = 0; //截到尾部的空格 
  30.  
  31.    return s; 
  32.     
  33.  
  34. void test_trim(char * s) 
  35.   char buf[1024]; 
  36.   printf("str:\"%s\" TRIM ",s); 
  37.   strcpy(buf,s); 
  38.   printf("\"%s\"\n",trim_space(buf)); 
  39.  
  40. void test1() 
  41.    test_trim(""); 
  42.    test_trim(" "); 
  43.    test_trim(" "); 
  44.    test_trim(" "); 
  45.    test_trim("a"); 
  46.    test_trim("abc"); 
  47.    test_trim(" abc"); 
  48.    test_trim(" abc "); 
  49.    test_trim(" abc def"); 
  50.    test_trim(" abcd add ada "); 
  51.  
  52. int main() 
  53.   test1(); 

原文:http://blog.chinaunix.net/u3/105675/showart_2177705.html

(Andrew Huang)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201011/10407.html]
本文出处:blog.chinaunix.net 作者:Andrew Huang
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容