#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);
}
#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);
}