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