我无法弄清楚如何擦除结构类型数组的条目。我正在阅读我买的那本书,但是那里没有章节,似乎我找不到任何功能来做到这一点。我想这更与手动相关。我想到了这一点,我能想到的唯一方法是将现有阵列的位置改为想要删除它的人,但我不知道该怎么做。
#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");
}
}
答案 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 *
成员),则需要在覆盖之前从已删除的结构中释放任何已分配的内存。