Как удалить диапазон элементов из массива в c

Мне нужно удалить ряд элементов из массива, но я не могу понять, как это сделать. Я пробовал это для цикла, где начало - это начало диапазона, а конец - конец диапазона.

for (i=0;i<n;i++){
a1[start+i] = a1[end+i+1];;
}

Что не работает?

Eugene Sh. 13.09.2018 19:35

Добавьте, пожалуйста, что происходит с тем, что вы пробовали. Если возможно, укажите фактический и ожидаемый результат.

njras 13.09.2018 19:36

Проверьте свое состояние, я думаю, вам стоит попробовать i <n-end.

Leon Trotsky 13.09.2018 19:38

@ p.martin можете ли вы предоставить пример ввода и вывода, а также можете разместить здесь свой код целиком. Тогда нам будет легко

zenwraight 13.09.2018 20:00

Прочитать как отлаживать небольшие программы

Basile Starynkevitch 13.09.2018 20:36
1
5
409
2

Ответы 2

I need to remove a range of elements from an array but I can't figure out how. I tried this for loop where start is that start of the range and end is the end of the range.

Проблема заключается в вашем цикле 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 Librarystring.h имеет предопределенные функции для перемещения и настройки массива. Вы также можете использовать их, так как они хорошо протестированы.

Это функции memmove и мемсет. Однако длина этих функций определяется числом байтов, которые нужно переместить или установить. Вам необходимо использовать оператор sizeof для вычисления количества байтов для перемещения определенного количества элементов.

когда я пытаюсь использовать эту функцию, я получаю ошибку сегментации (дамп ядра).

p. martin 15.09.2018 23:27

Какие параметры вы передали этой функции?

abhiarora 23.04.2019 19:43

to remove a range of elements from an array

В 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);

Код OP вызывает сомнения относительно того, что такое n?
Я ожидал, что количество итераций цикла будет end - start + 1.

sub_range_count = end - start + 1;
for (i=0; i<sub_range_count; i++){
  a1[start+i] = a1[end+i+1];;
}

Это по-прежнему оставляет более позднюю часть массива с исходными значениями.

как я могу сделать это без использования функций memmove и memset?

p. martin 14.09.2018 00:28

Другие вопросы по теме