2016-09-19 3 views
2

Я новичок в C, и я пытаюсь работать через функцию внутри программы, которая удаляет целое число 5 из массива различной длины, а также сокращает затем массива для размещения. a[0] - это элемент в массиве, который определяет длину этого массива. v - это элемент, который будет удален из массива. В остальном коде, а также во всех других деталях это учитывается.Получение неожиданного результата при попытке удалить элемент из массива в C

Ниже приведен код, который я написал для функции:

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), если длина массива, прочитанного внутри, является именно этим числом, я получаю неожиданный ответ. Однако для любого другого чтения в массиве я получаю ожидаемые (правильные) результаты. Любые изменения в кодировании должны выполняться внутри функции, так как именно эта проблема была представлена ​​мне.

Спасибо, извините за длинный пост (если есть). Я не слишком привык к использованию форумов.

+1

Есть ли [0] длина массива, включая [0]? –

+0

'if (a [i] == v)' -> 'while (a [i] == v)' – BLUEPIXY

ответ

2

Вам нужно пропустить элемент, удерживающий длину, она должна быть: для (i = 1; i <= a[0]; i++)

+0

Спасибо, это сработало как шарм! Вы не могли себе представить, как долго я застрял в этом удовольствии. Или, может быть, вы могли бы ... – Modrummer

+0

@Modrummer Я однажды провел неделю, пытаясь найти ',' который должен был быть ';'. Коллега вошел, взглянул и сказал: «Вы знаете, что у вас есть запятая вместо полуколоны?» – Tibrogargan

2

Похоже, ваш внешний контур смотрит на a[0], как если бы это был фактический элемент вашего массива (а не длина). Попробуйте:

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

Обратите также внимание, что я использовал <= там, потому что если у вас есть три элемента, они были бы в a[1], a[2] и a[3]. Если вы этого не сделаете, вам не удастся удалить элемент, который будет последним в вашем массиве.

+0

Хороший улов на '<=' – Tibrogargan

0

Если a[0] - длина массива, следует ли его удалить? Без сохранения сначала? Кроме того, разве вы не должны перемещать все элементы исходного массива? Только один раз?

Вы должны попробовать реорганизовать свой алгоритм. Подсказка: вам нужен только один цикл с текущим индексом и количеством удаленных элементов.

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]; 
     } 
    } 
} 
Смежные вопросы