Amigo, você pode usar ponteiros para essa ação
Um exemplo bem tosco de como você pode fazer essa operação e obter o resultado que você deseja
int vetor[5]; // Vetor que contém os valores
int* vetorNovo=(int *)malloc(sizeof(int)); // Ponteiro para o novo vetor
int* InicioDoVetorNovo=vetorNovo; // Posição inicial do 'vetorNovo'
vetor[0]=10; // Simulando entrada de valores
vetor[1]=20;
vetor[2]=30;
vetor[3]=40;
vetor[4]=50;
// Aqui vem a 'manha' você pode substituir os valores 'apagados' por algum caractere especial
vetor[2]='\#'; // No caso usei '#', aqui não ocorre problema de definição de tipo porque o '\#' é o um 'número', por isso esse exemplo não é muito eficiênte. Mas funciona
vetor[4]='\#';
// Ira mostrar os dados
printf("%i, %i, %c, %i, %c",vetor[0],vetor[1],vetor[2],vetor[3],vetor[4]);
for(int i=0;i<5;i++) // 5 é o tamnho do vetor que pode ser obtido com à função 'strlen'
{
// Caso o valor contido em 'vetor' seja diferente do caractere especial que você usou
if(vetor[i] != '\#' && vetor[i] != NULL) //
{
*vetorNovo=vetor[i]; // Adiciona esse valor no seu vetor
vetorNovo++; // Soma '''''+1 int'''''' no vetorNovo
/*
Caso você desconheça o uso de ponteiros, o melhor é começar a estuda-los quando você estiver um pouco mais afiado na linguagem
*/
}
}
vetorNovo=InicioDoVetorNovo; // Recupera o ind de mémoria do 'vetorNovo' /-----> VETORNOVO ESTÁ REPETIDO
printf("\n%i, %i, %i, %i, %i",vetorNovo[0],vetorNovo[1],vetorNovo[2],vetorNovo[3],vetorNovo[3]); // Mostra todos os valores do vetor que não foram '''apagados'''
//Você também pode remover o vetor antigo, mas como esse código é básico, não tem a nescessidade de performace