您的位置:首页 > 其它

简单的C程序<二>:字符间空格处理

2015-12-25 17:57 369 查看
问题:编写一个函数trim(char s[])将s中连续的多个空格用一个空格代替。

解法一:

#include <stdio.h>
#include <stdbool.h>

void func(char s[]);

int main(void)
{
char s[100];
gets(s);
func(s);
puts(s);

return 0;
}

void func(char s[])
{
int i,j;
bool flag = false;
i = j = 0;

while (s[i] != '\0')
{
if (s[i] != ' ')
{
flag = true;
s[j++] = s[i++];
}
if (flag==true)
{
flag = false;
s[j++] = s[i++];
}
else
{
i++;
}
}
s[j] = '\0';
}


总结:对于字符串的复制,一定定注意要在末尾加上\0

问题二:编写一个函数trim(char s[], int k)将s中连续的多个空格用k个空格代替,若字符间空格数量小于k则保持原样即可

解法一(for循环版):

#include <stdio.h>

void trim(char s[], int k);

int main(void)
{
char s[100];
gets(s);
trim(s,2);
puts(s);

return 0;
}

void trim(char s[], int k)
{
int i,j,tmp;
tmp = k;

for (i=j=0; s[i]!='\0'; ++i)
{
if (s[i] != ' ')
{
tmp = k;
s[j++] = s[i];
}
else if (s[i]==' ' && --tmp>=0)   //注意边界条件
{
s[j++] = s[i];
}
else
{
while ( s[i++] == ' ');
i -= 2;   //注意,循环退出时,s[i]不等于空格,且之后i又加了1 ,所以这里减2
}
}
s[j] = '\0';
}


总结:对于边界条件要想清楚,一定要考虑以下两个方面:

1. 循环控制的条件

2. 循环退出时的状态

就拿上面的程序来看:

解法二(while循环版):

#include <stdio.h>

void trim(char s[], int k);

int main(void)
{
char s[100];
gets(s);
trim(s,2);
puts(s);

return 0;
}

void trim(char s[], int k)
{
int i,j,tmp;
i = j = 0;
tmp = k;

while ( (s[j++]=s[i++]) != '\0')
{
if (s[i-1] != ' ')   //字符
tmp = k;
else if (s[i-1]==' ' && --tmp>0) //k个空格以内
continue;
else  //超出了k个空格
{
i--;
while (s[i++] == ' ');
i--;
}
}
}


总结:自己可以写完for循环,可以再试试while循环,对于一些条件还是不一样的,反正我不是一次能写成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: