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

来源:互联网 发布:电脑做账软件 编辑:程序博客网 时间:2024/06/02 02:02

问题:编写一个函数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循环,对于一些条件还是不一样的,反正我不是一次能写成功。

0 0