我正在尝试编写一个程序,允许添加有关不同类型星星的数据并将它们打印回屏幕上。为什么这不起作用:
typedef union{
struct{
char name_main[30];
int age;
char color[12];
};
struct{
char name_binary[30];
double radius_1, radius_2;
};
struct{
char name_light[30];
double luminosity_low, luminosity_high, period;
};
}STARS;
int main(int argc, char **argv)
{
bool running = true;
int choice;
STARS *star = (STARS *)malloc(sizeof(star));
printf("Star Menu\n");
putchar('\n');
while(running)
{
putchar('\n');
printf("Please choose a type of star:\n");
printf("1. Main Sequence Star\n2. Binary Star\n3. Variable Light Star\n4. Exit\n");
scanf("%d", &choice);
switch(choice)
{
case 1:
printf("You've chosen: Main Sequence Star\n");
printf("Please enter the name of the star:\n");
scanf("%s", star->name_main);
//printf("%s", star->name_main);
printf("Please enter the age of: %s\n", star->name_main);
scanf("%d", &star->age);
printf("Age: %d\n", star->age);
printf("Please enter the color of: %s\n", star->name_main);
scanf(" %s", star->color);
printf("Color: %s\n", star->color);
// printf("Type : Main sequence | Name : %s | Age : %d | Color : %s\n", star->name_main, star->age, star->color);
break;
case 2:
printf("You've chosen: Binary Star\n");
printf("Please enter the name of the star:\n");
scanf("%s", star->name_binary);
printf("Name: %s\n", star->name_binary);
printf("The radius of the first star:\n");
scanf("%lf", &star->radius_1);
printf("The radius of the second star:\n");
scanf("%lf", &star->radius_2);
printf("Radius 1: %.2lf | Radius 2: %.2lf\n", star->radius_1, star->radius_2);
break;
case 3:
printf("You've chosen: Variable Light Star\n");
break;
case 4:
printf("Exit\n");
running = false;
break;
}
}
return 0;
}
我使用结构的联合,因为每个星都有特定的特征,当我们为某种类型编写时,我们不关心其他星的特征。问题出现在颜色上,如果我写 red
,输出将是:Color: r:
。我试过在格式说明符之前添加一个空格,在使用 scanf 之前使用一个字符,但问题仍然存在,我不知道为什么。有什么想法吗?
答案 0 :(得分:4)
您没有分配足够大小的缓冲区。 sizeof(star)
是指针的大小。指针的长度通常为 4 字节或 8 字节,但 char name_main[30];
的结构长度至少为 30 字节。
另请注意,malloc()
族的转换结果为 considered as a bad practice。
错误的线路:
STARS *star = (STARS *)malloc(sizeof(star));
应该是:
STARS *star = malloc(sizeof(*star));
答案 1 :(得分:4)
STARS *star = (STARS *)malloc(sizeof(star));
这是一个错误。 sizeof(star)
返回指针的大小,而不是结构。
将其更改为:STARS *star = (STARS *)malloc(sizeof(*star));
以解决您的问题。