编制一个字符串整理函数ver(char *),实现将已知字符串s中的前导空白符和尾随的空白类字符去掉,并将字符串非空白类字符之间的连续多个空白类字符缩减为一个
char *ver(char *s)
{ char *p=s,*q=s;
/*掠过前导空白符*/
for (;*s==' ' || *s=='\t' || *s=='\n';s++);
for (;*s;) { /*顺序访问字符串s中的每个字符*/
*q++=(*s=='\t' || *s=='\n')?' ':*s;
if (*s!=' ' && *s!='\t' && *s!='\n') s++;
else
while (*s!=' ' || *s=='\t' || *s=='\n') s++;
}
if (q>p && *(q-1)== ' ') /*如q>p,则已复制过非空白字符*/
*(q-1)='\0'; /*如最后复制的是空白符,将其改为字符串结束符*/
else
*q='\0'; /*否则添加字符串结束符*/
return p;
}
对于本题,还可以设置状态进行处理,开始时让flg为0,表示程序将遇到的空白类符是字符串的前导空白符;flg为1表示在复制过程中遇到了一个中间空白类字符;
flg为2表示一个空白符字符已经处理结束.
1 char *ver(char *s)
2 {
3 int flg=0;
4 char *p=s,*q=s;
5 for (;*s;s++) { /*顺序访问字符串s中的每个字符*/
6 if (*s==' ' || *s=='\t' || *s=='\n') /*遇空白类字符*/
7 flg=(flg==2)?1:flg;
8 else {
9 if (flg==1)
10 *q++=' '; /*遇到空白类字符,复制下一个空白符*/
11 *q++=*s; /*复制当前字符*/
12 flag=2; /*一个中间空白符列处理结束*/
13 }
14 }
15 *q='\0';
16 return p;
17 }