编写函数,使其能处理字符串中除字母(大小写)、数字外的其他ASCII字符,对连在一起的相同字符,使其缩减至仅保留一个。 (参考函数原型:void del(char* str)) 输入输出格式要求: 只编写函数,请勿输出其他字符 例如: str为:aa*++1123., 调用del函数之后str为:aa*+1123.,
第一个字符是一定可以输出的,在是其他ASCII码的情况下,如果第一个字符与第二个字符相同,我们只需要不输出第二个字符就行了。我们只需要比较该字符与前一个字符作为判断,这样就可以最后一个字符与空字符恒不等的情况(比较该字符与后一个字符作为判断时),此外不能在循环中统一递增,错误代码如下:
void del(char* str)
{
char *p=str;
str++;
p++;
while(*p!='\0')
{
if(('0'-1<*p&&*p<'9'+1)||('a'-1<*p&&*p<'z'+1)||('A'-1<*p&&*p<'Z'+1))
{
*str=*p;
}
else
{
if(*p==*(p-1))
{
p++;
}
else
{
*str=*p ;
}
}
str++;
p++;
}
*str='\0';
}
这段代码错误发生在
if(*p==*(p-1))
{
p++;
}
此处没有对*str进行赋值,但后面又进行了递增,所以,运行到该处的*str会保留原值,进而导致输出错误。
正确代码如下
void del(char* str);
void del(char* str)
{
char *p=str;
str++;
p++;
while(*p!='\0')
{
if(('0'-1<*p&&*p<'9'+1)||('a'-1<*p&&*p<'z'+1)||('A'-1<*p&&*p<'Z'+1))
{
*str=*p;
str++;p++;
}
else
{
if(*p==*(p-1))
{
p++;
}
else
{
*str=*p ;
str++;p++;
}
}
}
*str='\0';
}