一个删除字符的错误
文章目录
Description
删除一个字符数组中指定的字符,对删除的字符个数计数,然后按照计数移动数组中的元素
Algorithm
{% codeblock lang:c %} #include <stdio.h> #include <string.h>
#define MAXSIZE 100
typedef struct
{
char ch[MAXSIZE + 1];
int length;
} Str;
void delete_ch(Str &str, char ch)
{
if (str.length != 0)
{
int ch_num = 0;
int i, j;
i = 0;
while (str.ch[i] != '\0')
{
if (str.ch[i] == ch)
{
++ch_num;
for (j = i + 1; str.ch[j] != ch && str.ch[j] != '\0'; j++)
str.ch[j - ch_num] = str.ch[j];
i = j;
--str.length;
}
else
++i;
}
str.ch[str.length] = '\0';
}
}
void myDelete_ch(Str &str, char ch) //error
{
int i, j;
int ch_ct = 0;
for (i = 0; str.ch[i] != '\0'; i++)
{
if (str.ch[i] == ch)
{
++ch_ct;
for (j = i; str.ch[j + 1] != ch && str.ch[j+1] != '\0'; j++)
{
str.ch[j] = str.ch[j + ch_ct];
}
i = j + 1;
--str.length;
}
}
str.ch[str.length] = '\0';
}
void show(Str str)
{
for (int i = 0; i < str.length; i++)
putchar(str.ch[i]);
putchar('\n');
}
int main(void)
{
Str str;
strcpy(str.ch, "abcadefghi");
str.length = 10;
show(str);
delete_ch(str, 'a');
//myDelete_ch(str, 'a');
show(str);
}
{% endcodeblock %}
Comments
delete_ch
输出:
abcadefghi
bcdefghi
然而myDelete_ch
输出
abcadefghi
bccadefgh
首先其中一个错误是使用了for
循环,导致遇到相同字符ch
时对字符串进行移动处理后增加i
的位置,其实不应该增加。
下面是修改后的函数:
{% codeblock lang:c %}
void myDelete_ch(Str &str, char ch) //error
{
int i = 0, j;
int ch_ct = 0;
while (str.ch[i] != '\0')
{
if (str.ch[i] == ch)
{
++ch_ct;
for (j = i; str.ch[j + 1] != ch && str.ch[j + 1] != '\0'; j++)
{
str.ch[j] = str.ch[j + ch_ct];
}
i = j + 1;
--str.length;
}
else
++i;
}
str.ch[str.length] = '\0';
}
{% endcodeblock %}
其输出为:
abcadefghi
bccefghi
依然有问题,str.ch[j] = str.ch[j + ch_ct];
表示把后面的元素的值赋给前面的元素,但是随着i
的增加,后面的元素会被前面的元素覆盖。