我需要从数组中删除一系列元素,但我无法弄清楚如何。我尝试了这个循环,其中start是范围的开始,end是范围的结束。
for (i=0;i<n;i++){
a1[start+i] = a1[end+i+1];;
}
从数组中删除一系列元素
在C中,一旦定义了数组,元素的范围就是固定的。他们无法删除。 @hyde
代码可以在运行时重新分配元素值。
使用数组[1,2,3,4,5,6,7]
,我们想要“移除”[3,4,5]
然后最终使用[1,2,6,7, x, x, x]
。这里x
需要一些价值,也许是0。
size_t start; // Array index of sub-range beginning to "remove"
size_t end; // Array index of sub-range end to "remove"
size_t n = sizeof a1/sizeof a1[0]; // Number of elements in the array
assert(start < n && end < n && start <= end);// Make certain we have sane input
size_t n_move = end - start + 1; // Number of elements to move
memmove(&a1[start], &a1[end + 1], sizeof a1[0]*n_move);
size_t n_clear = n - end; // Number of elements to zero
memset(&a1[end + 1], 0, sizeof a1[0]*n_clear);
关于什么是n
的OP代码是值得怀疑的?
我希望循环迭代计数为end - start + 1
。
sub_range_count = end - start + 1;
for (i=0; i<sub_range_count; i++){
a1[start+i] = a1[end+i+1];;
}
这仍然使数组的后半部分具有原始值。
我需要从数组中删除一系列元素,但我无法弄清楚如何。我尝试了这个循环,其中start是范围的开始,end是范围的结束。
问题在于你的condition
的for
循环。如果你想从length - end - 1
指数中删除start
指数(包括end
),它应该是end
。我已经尝试过你的问题并修复了它。你可以尝试运行它。
我假设你一直试图移动int
数组的元素。
#include <stdio.h>
int arrayRemove(int *array, size_t length, int start, int end)
{
if (start >= length)
return length;
if (end >= length)
return length;
if (start > end)
return length;
int i;
int toMove = length - end - 1;
for (i = 0; i < toMove; i++)
array[start + i] = array[end + i + 1];
return length - end + start - 1;
}
#define SIZE 20
int main(int argc, char *argv[])
{
int i;
int array[SIZE];
int start = 10, end = 15;
for (i = 0; i < SIZE; i++)
array[i] = i;
for (i = 0; i < SIZE; i++)
printf("Array Element (%d): %d\r\n", i, array[i]);
printf("---------------------\r\n");
int finalLength = arrayRemove(array, SIZE, start, end);
for (i = 0; i < finalLength; i++)
printf("Array Element (%d): %d\r\n", i, array[i]);
return 0;
}
虽然C Standard Library
string.h
已经预定义了移动和设置数组的功能。您也可以使用它们,因为它们经过了良好的测试。
功能是memmove和memset。但是,这些函数在移动或设置的字节数方面需要很长的时间。您需要使用sizeof
运算符来计算移动特定元素数的字节数。