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的增加,后面的元素会被前面的元素覆盖。