从C中删除结构中数组的条目

时间:2014-08-10 18:10:35

标签: c arrays struct

我无法弄清楚如何擦除结构类型数组的条目。我正在阅读我买的那本书,但是那里没有章节,似乎我找不到任何功能来做到这一点。我想这更与手动相关。我想到了这一点,我能想到的唯一方法是将现有阵列的位置改为想要删除它的人,但我不知道该怎么做。

#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 个答案:

答案 0 :(得分:0)

给定一些结构类型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 *成员),则需要在覆盖之前从已删除的结构中释放任何已分配的内存。