为什么scanf读取垃圾?

时间:2021-05-18 16:57:48

标签: c

我正在尝试编写一个程序,允许添加有关不同类型星星的数据并将它们打印回屏幕上。为什么这不起作用:

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 之前使用一个字符,但问题仍然存在,我不知道为什么。有什么想法吗?

2 个答案:

答案 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)); 以解决您的问题。

相关问题