OK

#include <stdio.h>
#include <string.h>

/**
***实现功能:格式化文本,过滤文本中的不能打印的字符(例如换行等),以及多余的空格(即如果2个空格连起来,则只能保留一个)。
***/

/*********************************************************************************
函数名称: FormatText                                                      
函数功能: 把文本中多余的空格和控制字符删除,返回新的长度。                          
入参:
 str:文本地址
 len:文本大小

出参:      
 str:把修改后的文本覆盖回去。
返回值: 新的文本长度
***********************************************************************************/
void FormatText(char* str, int len)
{

 int i=0,j=0;
 for(i =0;i<len;i++)
 {
  //if((32 == str[i] && 32 == str[i+1]) || 10 == str[i] || 9 == str[i])
    if((32 == str[i] && 32 == str[i+1]) || (str[i] >= 0 && str[i] <= 31))
  {
   for(j=i;i<len;i++)
   {
    str[i] = str[i+1];//所有字符向前移,包括最后的\0结束符。
   }
   i = j;
   i--;//多于连续空格或控制符的处理

   /*
        直接使用“(str[i] >= 0 && str[i] <= 31)”进入死循环的原因是:  
        
        1. 字符串被处理后,长度会不断变短,因此str[i]最终肯定会读到不属于字符串本身的部分,也就是结束符
        2. 字符串的结束符的值是0,在0—31区间内,并且无法删除
        3. 处理后的字符串的长度会变短,始终小于len的值,因此大循环条件的i值始终符合小于len的条件
        4. 并且有i--的条件,导致i值始终不变,并且小于len,而字符串结束符也无法删除
        就进入死循环了

        解决办法是:让len值变成动态的,字符串处理一次,len减一,使i值在大循环判断是不符合条件,进而退出循环   经验证,可以达到要求
        
        这些东西全是从调试看出来了,学会调试代码是十分重要的。慢慢来,从小程序的调试开始,循序渐进
    */
   len--;
  }
 
 }
 printf("新文本长度是%d.\n",strlen(str));
 printf("%s",str);
 
}

void main()
{
    char str[] = "  123 456  78      9 \n10 \t11 ";
    printf("%s",str);
    int lenth = strlen(str);
    printf("原文本长度是%d.\n",lenth);
    FormatText(str,lenth);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值