输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入一个字符串 str,再输入一个字符 c,将字符串 str 中出现的所有字符 c 删除。
要求定义并调用函数delchar(str,c), 它的功能是将字符串 str 中出现的所有 c 字符删除,函数形参str的类型是字符指针,形参c的类型是char,函数类型是void。
输入输出示例:括号内为说明
输入
3 (repeat=3)
happy new year (字符串"happy new year")
a (待删除的字符'a')
bee (字符串"bee")
e (待删除的字符'e')
111211 (字符串"111211")
1 (待删除的字符'1')
输出
result: hppy new yer (字符串"happy new year"中的字符'a'都被删除)
result: b (字符串"bee"中的字符'e'都被删除)
result: 2 (字符串"111211"中的字符'1'都被删除)
关键是删除程序的理解不懂。
1.void delchar(char *str, char c)
{
int i,j;
for (i=j=0;str[i]!='\0';i++)
{ if (str[i]!=c)
str[j++]=str[i];}
str[j]='\0';
}
这段程序的最后三行怎么理解?
2.void delchar(char *str, char c){ char *p,*q;
p=str;
while(*p!='\0')
{ if(*p==c)
{ q=p;
while(*q!='\0')
{ *q=*(q+1); q++;}
*q='\0';
}
if(*p!=c) p++;
}
}
这段我是真心看不懂,指针什么的不是很懂啊。麻烦讲的基础点
str[j++]=str[i];} // 将他们重新保存到str数组中 这个是怎么保存的,关于J++和I能说明下吗
追答额。。。给你举个具体的例子吧。。
假设字符指针 char *str="beef";待删字符是c='e';
if(str[i]!=c) 首先我们看第一次循环,i=0,str[0]='b',不等于'e',str[j++],此时j等于0,把str[0]='b'保留,j再自增1,然后第二第三次循环str[1]和str[2]都等于'e',故if语句块里的内容不执行,直到str[3]='f',不等于'e',此时保存'f'到str[1]中,j再自加,变成2,最后加上字符串结束标志str[2]='\0';这样就把相应的字符去掉了,其实字符串还是原来的字符串,只不过把原来的都覆盖掉了,再加上'\0'后,即使'\0'后面还有字符,也无法输出。。。