我有这段代码
#include "stdio.h"
#include "stdlib.h"
#include <string.h>
typedef struct {
char brand[40];
int year;
int km;
float price;
}Autos;
int userInput;
void menu();
void scanCars(Autos *pointer);
void print_struct(Autos *pointer);
int main(int argc, char const *argv[])
{
Autos *pointerCar, Cars;
pointerCar=&Cars;
pointerCar=(Autos *)malloc(5*sizeof(Autos));
int value= 1;
while (value)
{
menu();
switch (userInput)
{
case 1:
scanCars(pointerCar);
break;
case 2:
print_struct(pointerCar);
break;
case 3:
value=0;
break;
}
}
free(pointerCar);
return 0;
}
void menu()
{
printf("1) Input Cars:\n" );
printf("2) Print Cars:\n" );
printf("3) Exit\n" );
scanf("%d", &userInput );
printf("=================\n" );
}
void scanCars(Autos *pointer)
{
printf("1) Scanning CARS:\n");
for (int i = 0; i < 2; i++)
{
printf("Brand:");
scanf("%s", (pointer+i)->brand);
printf("Year: ");
scanf("%d", &(pointer+i)->year );
printf("Kilometros:");
scanf("%d",&(pointer+i)->km );
printf("price: ");
scanf("%f",&(pointer+i)->price );
}
printf("=================\n" );
}
void print_struct(Autos *pointer)
{
for (int i = 0; i < 3; i++)
{
printf("Car #[%d]\n",i+1 );
printf("Brand: %s\n",(pointer+i)->brand);
printf("Year: %d\n",(pointer+i)->year );
printf("Kilometraje: %d\n",(pointer+i)->km );
printf("Price: $%.2f\n",(pointer+i)->price );
printf("=================\n" );
}
}
代码运行正常,可存储一些汽车数据,然后在询问时打印出来。
当我第二次尝试存储新车数据时,我丢失了最后一次输入。所以我的问题是如何存储新的结构数组并打印整个数据:
答案 0 :(得分:1)
首先,要避免一些事情使代码更易读,更容易调试:
Autos *pointerCar, Cars;
- 不要这样做,这会加剧可读性。我假设您要声明两个指针:pointerCar
- 对于单个车辆,cars
表示一系列车辆。在您的代码中,您已声明指针pointerCar
和变量 Cars
。
建立一个命名约定并坚持下去。如果您对类型使用CamelCase,请不要将其用于变量(请改用camelCase或snake_case)。不要使用复数类型。我会这样写:
Auto *single_car;
Auto *cars;
使用calloc
进行结构和数组初始化,因为它用零填充分配的内存,这很方便。
cars = (Auto*) calloc(5, sizeof(Auto));
您丢失了上次输入,因为每次调用scanCars
函数时,都会反复传递相同的指针。您的*pointerCar
指向5个自动数组,然后用scanCars
中的数据填充它并从函数返回。下次调用scanCars
时,它会将相同的指针作为参数传递并覆盖数据。
我将在TOTAL中共有15辆车,但每辆AUTOS将有5辆CARS;
这里出了点问题。您只定义了一种类型:Autos
(应该只是Auto
)。如果为5个Autos分配空间,您将获得一个指向内存的指针,该内存已准备好存储5个Auto结构,仅此而已。
如果您想将Autos分组到某种形式的假设车库,您必须创建一个指向Auto的指针表(或简单地说:Autos表格表)。例如:
Auto *garage[3];
garage[0] = (Auto*) calloc(5, sizeof(Auto));
garage[1] = (Auto*) calloc(5, sizeof(Auto));
garage[2] = (Auto*) calloc(5, sizeof(Auto));
现在garage
的每个元素都包含一个包含5个Autos的数组。要访问车库中的汽车,您需要写下:garage[1][0].year
。
现在您可以将车库传递给scanCars
功能:scanCars(garage[0])
。请记住在scanCars
中调整for循环,因为它设置为仅填充2辆车,现在应该有5辆。
答案 1 :(得分:0)
如果您有5辆汽车,请声明汽车阵列:
Auto Cars[5];
然后你将pointerCar按顺序指向每个0到4的汽车。
答案 2 :(得分:0)
使用指针数组可以很容易地解决这个问题。
Autos *pointerCar;
此指针可用于存储Autos类型的一个结构的地址。你可以像这样使用数组。
Autos *pointerCar[number_of_cars];
对于第i个汽车,将第i个指针分配给malloc为
pointerCar[i]=(Autos *)malloc(sizeof(Autos));
如果您不了解指针数组,请参阅this。