本题要求实现一个删除字符串中的指定字符的简单函数。
答案:
void delchar( char *str, char c )
{
int i,j;
for (i = 0; * (str + i) != '\0'; i++)
if (*(str + i) == c)
{
for (j = i; * (str + j) != '\0'; j++)
*(str + j) = *(str + j + 1);
i=-1;//一定不能少
}
}
分析:
第一次我的代码如下:
void delchar( char *str, char c )
{
int i,j;
for (i = 0; * (str + i) != '\0'; i++)
if (*(str + i) == c)
for (j = i; * (str + j) != '\0'; j++)
*(str + j) = *(str + j + 1);
}
短小精干,但是是错的。。。。
是因为在把后面的值往前移动的时候,忽略了对刚刚移到这个位置的值的判断
听不懂我们看个例子:
当输入的字符串为"abbcdefg"时,
i=0 * (str+i)='a' 与字符变量c不相等
不对字符串进行处理 -----> "abbcdefg"
i=1 * (str+i)='b' 与字符变量c相等
按照设想应该用后面的元素将其替换 -----> "abcdefg"
i=2 * (str+i)='c' 与字符变量c不相等
不对字符串进行处理 -----> "abcdefg"
你就会惊讶的发现,刚刚连续的两个字符’b'没有被判断。
解决方法:
就是在每次判断到相等后,移动完所有元素后,从头开始再开始判断,不可接着原来的顺序继续判断下去。