尝试从C中的数组中删除元素时获得意外结果

时间:2016-09-19 01:43:18

标签: c arrays function

我是C的新手,我试图通过一个程序中的函数来完成一个程序,该函数将从不同长度的数组中删除整数5,然后缩短数组以适应。 a[0]是数组中确定数组长度的元素。 v是要从数组中删除的元素。在剩下的代码中,以及所有其他细节,这都被考虑在内。

以下是我为该函数编写的代码:

void delete_set(int v, int a[])
{
    int i;
    int j;

    for (i = 0; i < a[0]; i++)
        if (a[i] == v)
        {
            for(j = i; j < a[0]; j++)
                a[j] = a[j + 1];
            a[0] = a[0] - 1;
        }
}

所以,我不确定你是否需要在这个函数之外看到其余代码才有意义,但我的问题是这个。无论我将a[i] ==设置为(在if语句中),如果读入的数组的长度恰好是该数字,我得到一个意外的答案。但是,对于任何其他读入数组的长度,我得到预期的(正确的)结果。编码的任何变化都必须在函数内完成,因为这就是问题的呈现方式。

谢谢,抱歉这篇冗长的帖子(如果有的话)。我不习惯使用论坛。

4 个答案:

答案 0 :(得分:2)

你需要跳过持有长度的元素,它应该是: (i = 1; i <= a[0]; i++)

答案 1 :(得分:2)

看起来你的外部循环正在查看a[0],好像它是数组的实际元素(而不是长度)。尝试:

for (i = 1; i <= a[0]; i++) ...

另请注意,我在那里使用了<=,因为如果您有三个元素,则它们将位于a[1]a[2]a[3]中。如果你不这样做,你将无法删除阵列中最后一个元素。

答案 2 :(得分:0)

如果a[0]是数组的长度,是否应将其删除?没先保存它?另外,你不应该改变原始数组的所有元素吗?只有一次?

您应该尝试重构算法。提示:您只需要一个具有当前索引和删除元素数量的循环。

答案 3 :(得分:0)

内循环也有问题,因为它离开数组的末尾。您需要使用复制元素的for循环交换更改元素数量的位置。假设a [0]是包含[0]的数组的长度,那么我们有以下内容:

for (int i = 1; i < a[0]; ++i) {
    if (a[i] == v) {
        a[0] = a[0] - 1;
        for (int j = i; j < a[0]; ++j) {
            a[j] = a[j + 1];
        }
    }
}