编写一个函数,从一个字符串中去除多余的空格。

这道题是《C和指针》上面的习题,出自于65页第7题,题目描述为:

  编写一个函数,从一个字符串中去除多余的空格。函数的原型应该如下:

               void   deblank( char  string[] ) ;

当函数发现字符串中如果有一个地方由一个或多个连续的空格组成,就把它们改成单个空格字符。注意当你遍历整个字符串时要确保它以NUL字符结尾。

这道题我用了两种方法去完成,一种是不申请辅助空间,在原字符串上操作(不使用指针)。另外一种是声明一个指向字符型的指针,利用指针的特性,得出正确答案。

方法一:

             /*字符串去除多余的空格,一个或多个连续的空格变成一个空格(不申请辅助空间,原数组操作)*/
#include<stdio.h>
#include<string.h>
int main()
{
    void  deblank(char string[]);  /*函数声明语句*/
    char str[1000];
    gets(str);
    deblank(str);
    puts(str);                              //输入输出sum1和sum2的值来检验程序的错误
    return 0;
}
void  deblank(char string[])
{
    int i,j,k,blank = 0,str = 0;
    int sum1,sum2;     /*sum1是输入时字符串的长度,sum2是变换后字符串的长度*/
    int m,n = 0;
    sum1 = strlen(string);
    for(m = 0;string[m] !='\0';m++)
    {
        if(string[m] == ' ' && string[m+1] != ' ')
        {
            n++;         //用来计算空格区域的块数
        }

    }
    for(j = 0;j < sum1;j++)
    {
        if(string[j] == ' ')
        {
            blank++;
        }
    }
    for(i = 0;string[i] != '\0';)
    {
        if(string[i] == ' ')
        {
            for(j = i ;string[j] == ' ';j++)
            {
                str++;       /*计算每一块空格区域的空格数量*/
            }
        }
        if(string[i] != ' ')
        {
            i++;
        }
        if(str != 0)
        {
          for(k = j;k < sum1;k++)
          {
             string[k-str+1] = string[k];   /*字符前移*/
          }
          i = j-str+1;    /*i重置,从新的位置重新扫描*/
        }
        if(str == sum1)     /*字符串中全部都是空格的情况*/
        {
            string[0] = ' ';
            string[1] = '\0';
        }
        str = 0;   /*最后str要重置为0后,再进入下一次循环*/
    }
    sum2 = sum1-blank+n;
    string[sum2] = '\0';
    //printf("blank = %d\n",blank);
    //printf("n = %d\n",n);
    //printf("sum1 = %d\n",sum1);    //当程序出错时,用于调试程序的错误,找出错误并且改正
    //printf("sum2 = %d\n",sum2);
}
上述是方法一,在原字符串上操作,其实这道题我想了挺久的,在计算空格区域那里一直卡着,后来就问了我的一个学长,顿时茅塞顿开了,代码量还是非常少,还是得加油,至少到目前,C语言还没有入门,闲话还是少说,贴上第二种方法的代码吧。

方法二:(利用指针)

  <pre name="code" class="plain">             /*字符串去除多余的空格,一个或多个连续的空格变成一个空格(声明一个新的数组存储)*/
#include<stdio.h>
#include<string.h>
int main()
{
    char  *deblank(char string[]);  /*函数声明语句*/
    char a[100],*p;
    int i,j;
    gets(a);
    p = deblank(a);
    puts(p);
    return 0;
}
char *deblank(char string[])
{
    int i,j = 0;
    char  *str = string;
    for(i = 0;string[i] !='\0';i++)
    {
        if(string[i] !=' ')
        {
            *str++ = string[i];
        }
        if((string[i] == ' ') && !(string[i+1] == ' '))  /*该情况适用于字符串全是空格的情况下*/
        {
            *str++ = string[i];
        }
    }
    *str = '\0';   /*注意关键错误点,字符数组string有效部分已经遍历完毕,由于str指向的数组被赋值后,指针str自加,
                    *因此这时候指针str已经指向字符数组string最后一位,即指向要添加'\0'的地方
                    */
    //str = string;   /*将str指针的指向重新调至字符串的首位*/
    return string;
}

 


 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值