这道题是《C和指针》上面的习题,出自于65页第7题,题目描述为:
编写一个函数,从一个字符串中去除多余的空格。函数的原型应该如下:
void deblank( char string[] ) ;
当函数发现字符串中如果有一个地方由一个或多个连续的空格组成,就把它们改成单个空格字符。注意当你遍历整个字符串时要确保它以NUL字符结尾。
这道题我用了两种方法去完成,一种是不申请辅助空间,在原字符串上操作(不使用指针)。另外一种是声明一个指向字符型的指针,利用指针的特性,得出正确答案。
方法一:
/*字符串去除多余的空格,一个或多个连续的空格变成一个空格(不申请辅助空间,原数组操作)*/
#include
#include
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语言还没有入门,闲话还是少说,贴上第二种方法的代码吧。
方法二:(利用指针)
/*字符串去除多余的空格,一个或多个连续的空格变成一个空格(声明一个新的数组存储)*/
#include
#include
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;
}