Удаление записи из массива в структуре, в C

Я не могу понять, как я могу стереть запись массива типа структуры. Я читаю книгу, которую я купил, но нет главы об этом, и, кажется, я не могу найти какую-либо функцию для этого. Я думаю, это больше связано с руководством. Я думаю об этом, и единственный способ, о котором я могу думать, - это изменить положение существующего массива на тот, который хочет стереть его, но я не знаю, как это сделать.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct coches {
        int    id;
       char   nombre[10];
       char   marca[10];
       char   color[10];
       float  kilometros;
};

int insertar_datos(struct coches concesionario[30]); 
int checkout(char login[10], char password[10]); 
void mostrar_datos(struct coches concesionario[30],int x);
void eliminar_datos(struct coches concesionario[30],int x);

int main (void){

struct coches concesionario[30];
int menu, credenciales, x = 0;
char login[10],password[10];


puts("\n<><><>Bienvenido<><><>\n");

puts("\nAntes de poder usar el sistema deber estar autentificado\n");
while (credenciales != 1){
puts("\nDime tu usuario:\n");
scanf("%10s", &login);
puts("\nDime tu password:\n");
scanf("%10s", &password);
credenciales=checkout(login, password);
}

while (menu != 4){
puts("\nQue deseas hacer?\n");
puts("\n1)Insertar datos\n2)Listar coches\n3)Eliminar entradas\n4)Salir del programa\n");
scanf("%d", &menu);
switch(menu){

             case 1:

                  x = insertar_datos(concesionario);
                  break;


             case 2:

                  mostrar_datos(concesionario,x);
                  break;

             case 3:

                  eliminar_datos(concesionario,x);
                  break;

             }

}    


}   

int checkout(char login[10], char password[10]){

    if ((strcmp(strlwr(login),"12345") ==0 ) && (strcmp(strlwr(password),"12345") ==0)){

    return 1;

    }else{

    return 0;

} 
}

int insertar_datos(struct coches concesionario[30]){
    char respuesta[3];
    int x = 0;
    system("cls");
    while (!strstr(respuesta,"no")){
    puts("\nDime la id:\n");
    fflush(stdin);
    scanf("%d", &concesionario[x].id);
    system("cls");
    puts("\nDime el modelo:\n");
    fflush(stdin);
    scanf("%10s", &concesionario[x].nombre);
    system("cls");
    puts("\nDime la marca:\n");
    fflush(stdin);
    scanf("%10s", &concesionario[x].marca);
    system("cls");
    puts("\nDime el color:\n");
    fflush(stdin);
    scanf("%10s", &concesionario[x].color);
    system("cls");
    puts("\nDime los kilometros:\n");
    fflush(stdin);
    scanf("%d", &concesionario[x].kilometros);
    system("cls");
    x++;
    puts("\nQuieres insertar algo mas?\n");
    fflush(stdin);
    scanf("%3s", &respuesta);
    system("cls");
    strlwr(respuesta);
}

return x;


}

void mostrar_datos(struct coches concesionario[30],int x){

    int i;

    if (x <= 0){


    system("cls");      
    puts("\nRegistro vacio\n");


    }else{


    for (i = 0; i < x; i++){

        printf("\nID: %d\n\nModelo: %s\n\nMarca: %s\n\nColor: "
           "%s\n\nKilometros: %f\n",
           concesionario[i].id, concesionario[i].nombre, concesionario[i].marca,
           concesionario[i].color, concesionario[i].kilometros);
     }
     system("pause");
}  

}

void eliminar_datos(struct coches concesionario[30],int x){

    int i, cuenta = 0;

    if (x <= 0){

    system("cls");      
    puts("\nRegistro vacio\n");

    }else{

    for (i = 0; i < x; i++){

        printf("\nEntrada numero:%d\nID: %d\n\nModelo: %s\n\nMarca: %s\n\nColor: "
           "%s\n\nKilometros: %f\n", cuenta,
           concesionario[i].id, concesionario[i].nombre, concesionario[i].marca,
           concesionario[i].color, concesionario[i].kilometros);
           cuenta++;

     }

     puts("\nQue entrada quieres borrar?\n");
}  

}

1 ответ

Учитывая некоторый тип структуры struct Dataи массив a этого типа структуры:

struct Data a[20];
int n_data = 0;

…add data to array, incrementing `n_data`…

/* Delete item d from array */
assert(n_data > 0 && d >= 0 && d < n_data);
for (j = d + 1; j < n_data; j++)
    a[j-1] = a[j];
n_data--;

Это простой способ сделать это. Альтернативой является использование memmove() - и не memcpy() потому что в целом перемещаемые области перекрываются - вот так:

assert(d >= 0 && d < n_data);

memmove(&a[d], &a[d+1], n_data - d - 1);
n_data--;

Обратите внимание, что если в структуре выделена память (например, char * член), вам необходимо освободить любую выделенную память из удаленной структуры, прежде чем перезаписать ее.

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