我是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语句中),如果读入的数组的长度恰好是该数字,我得到一个意外的答案。但是,对于任何其他读入数组的长度,我得到预期的(正确的)结果。编码的任何变化都必须在函数内完成,因为这就是问题的呈现方式。
谢谢,抱歉这篇冗长的帖子(如果有的话)。我不习惯使用论坛。
答案 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];
}
}
}