Удаление записи из массива в структуре, в 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 *
член), вам необходимо освободить любую выделенную память из удаленной структуры, прежде чем перезаписать ее.