Koi

一个删除字符的错误

Description

删除一个字符数组中指定的字符,对删除的字符个数计数,然后按照计数移动数组中的元素

Algorithm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#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);
}

Comments

delete_ch输出:

abcadefghi
bcdefghi

然而myDelete_ch输出

abcadefghi
bccadefgh

首先其中一个错误是使用了for循环,导致遇到相同字符ch时对字符串进行移动处理后增加i的位置,其实不应该增加。

下面是修改后的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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';
}

其输出为:

abcadefghi
bccefghi

依然有问题,str.ch[j] = str.ch[j + ch_ct];表示把后面的元素的值赋给前面的元素,但是随着i的增加,后面的元素会被前面的元素覆盖。