如何从c中删除数组中的一系列元素

问题描述 投票:-1回答:2

我需要从数组中删除一系列元素,但我无法弄清楚如何。我尝试了这个循环,其中start是范围的开始,end是范围的结束。

for (i=0;i<n;i++){
a1[start+i] = a1[end+i+1];;
}
c arrays
2个回答
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];;
}

这仍然使数组的后半部分具有原始值。


0
投票

我需要从数组中删除一系列元素,但我无法弄清楚如何。我尝试了这个循环,其中start是范围的开始,end是范围的结束。

问题在于你的conditionfor循环。如果你想从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已经预定义了移动和设置数组的功能。您也可以使用它们,因为它们经过了良好的测试。

功能是memmovememset。但是,这些函数在移动或设置的字节数方面需要很长的时间。您需要使用sizeof运算符来计算移动特定元素数的字节数。

© www.soinside.com 2019 - 2024. All rights reserved.