Com esse seu código você sempre perderá o valor do <ultimo-1> elemento. A cada passada do loop você atribui 0 nessa posição. Eu não entendi se você tem o tamanho do vetor (qtd de valores preenchidos) ou se você usa um valor de controle no fim do vetor, para marcar onde ele acaba. Também não entendi se você quer remover todas as ocorrências de um certo "código" do vetor, ou se todas. Eu fiz esse código rapidinho, ele utiliza um sentinela no fim e remove apenas a primeira incidência do valor. Espero que ajude: #include <stdio.h>
int main (int argc, char* argv[])
{
int vetor[100] = {0,5,10,20,30, -42}; // preeencher vetor com scanf
int remove, sentinela, i;
remove = 5; // preeencher depois com scanf
sentinela = -42; // você disse que usa um controle, ele
// deve estar sempre presente no fim do vetor
i = 0;
while (vetor[i] != sentinela)
{
if (vetor[i] == remove)
{
vetor[i] = vetor[i + 1];
if (vetor[i] != sentinela)
vetor[i + 1] = remove;
}
i++;
}
for (i = 0; vetor[i] != sentinela; i++)
printf("%d\n", vetor[i]);
return 0;
}