鱼C论坛

 找回密码
 立即注册
查看: 82|回复: 1

[已解决]来了传递结构体指针

[复制链接]
发表于 2024-5-22 10:28:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>

struct Date {
        int year;
        int month; 
        int day;
        };

struct Name{
        char name[40];
        int age;
        int first;
        struct Date date1;
        int second ;
        struct Date date2;
        };

void inputName(struct Name *na);
void printName(struct Name *na);

void inputName(struct Name *na)
{
        printf("请输入姓名:");
        scanf("%s",na->name);
        printf("请输入年龄:");
        scanf("%d",na->age);
        printf("请问是否打过第一针(打过1/没打过0):");
        scanf("%d",na->first);
        if(na->first == 1){
                printf("请输入第一针日期(yyyy-mm-dd):");
                scanf("%d-%d-%d",na->date1.year,na->date1.month,na->date1.day);
                printf("请问是否接种过第二针:(接种1/未接种2)");
                scanf("%d",na->second);
                if(na->second == 0)
                {
                        printf("请尽快接种第二针");
                }else{
                        printf("请输入接种日期(yyyy-mm-dd):");
                        scanf("%d-%d-%d",na->date2.year,na->date2.month,na->date2.day);
                }
        }else{
                printf("请尽快接种第一针");
        }        
}

void printName(struct Name *na)
{
        printf("姓名:%s,年龄:%d\n",na->name,na->age);
        if (na->first == 1)
        {
                printf("接种第一针的时间为%d-%d-%d",na->date1.year,na->date1.month,na->date1.day);        
        }else{
                if(na->second == 1)
                {
                        printf("接种第二针的时间为%d-%d-%d\n",na->date2.year,na->date2.month,na->date2.day);        
                }else{
                        printf("未接种过第二针疫苗");        
                }

        printf("未接种过过疫苗\n");        
        }
        
}

int main()
{
        struct Name *n1,*n2,*n3;
        
        n1 = (struct Name *)malloc(sizeof(struct Name));        
        n2 = (struct Name *)malloc(sizeof(struct Name));        
        n3 = (struct Name *)malloc(sizeof(struct Name));        
        if(n1 == NULL || n2 == NULL || n3 == NULL)
        {
                printf("内存申请失败");
                exit(1);
        }
        inputName(n1); 
        inputName(n2); 
        inputName(n3); 
        
        printName(n1);
        printName(n2);
        printName(n3);

        free(n1);
        free(n3);
        free(n2);

        return 0;        
}
会发生段错误吐核
如何进行改进
最佳答案
2024-5-22 10:28:37
在你的代码中,发生段错误(Segmentation fault)的原因是你在使用scanf函数接收输入时,格式化字符串传递的变量类型不正确。scanf函数在接收字符数组类型时,需要使用%s作为格式化字符串,并且传递的是字符指针。而你的代码中使用了单个字符变量来接收,导致了段错误的发生。

另外,还有一个问题是在scanf函数中,传递结构体成员变量时,需要使用取地址符&来获取变量的地址。

下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>

struct Date {
    int year;
    int month; 
    int day;
};

struct Name{
    char name[20];
    int age;
    int first;
    struct Date date1;
    int second;
    struct Date date2;
};

void inputName(struct Name *na);
void printName(struct Name *na);

void inputName(struct Name *na)
{
    printf("请输入姓名:");
    scanf("%s", na->name);
    
    printf("请输入年龄:");
    scanf("%d", &(na->age));
    
    printf("请问是否打过第一针(打过1/没打过0):");
    scanf("%d", &(na->first));
    
    if(na->first == 1){
        printf("请输入第一针日期(yyyy-mm-dd):");
        scanf("%d-%d-%d", &(na->date1.year), &(na->date1.month), &(na->date1.day));
        
        printf("请问是否接种过第二针:(接种1/未接种2)");
        scanf("%d", &(na->second));
        
        if(na->second == 1){
            printf("请输入接种日期(yyyy-mm-dd):");
            scanf("%d-%d-%d", &(na->date2.year), &(na->date2.month), &(na->date2.day));
        }else{
            printf("请尽快接种第二针");
        }
    }else{
        printf("请尽快接种第一针");
    }        
}

void printName(struct Name *na)
{
    printf("姓名:%s,年龄:%d\n", na->name, na->age);
    
    if (na->first == 1){
        printf("接种第一针的时间为%d-%d-%d\n", na->date1.year, na->date1.month, na->date1.day);        
    }else{
        if(na->second == 1){
            printf("接种第二针的时间为%d-%d-%d\n", na->date2.year, na->date2.month, na->date2.day);        
        }else{
            printf("未接种过第二针疫苗\n");
        }
    }
}

int main()
{
    struct Name *n1, *n2, *n3;
        
    n1 = (struct Name *)malloc(sizeof(struct Name));        
    n2 = (struct Name *)malloc(sizeof(struct Name));        
    n3 = (struct Name *)malloc(sizeof(struct Name));        
    
    if(n1 == NULL || n2 == NULL || n3 == NULL){
        printf("内存申请失败");
        exit(1);
    }
    
    inputName(n1); 
    inputName(n2); 
    inputName(n3); 
    
    printName(n1);
    printName(n2);
    printName(n3);

    free(n1);
    free(n3);
    free(n2);

    return 0;        
}

在修改后的代码中,我将接收姓名的字符变量改为了字符数组,并分配了足够的存储空间。同时,在scanf函数中使用了正确的格式化字符串,并传递了正确的变量地址。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-22 10:28:37 | 显示全部楼层    本楼为最佳答案   
在你的代码中,发生段错误(Segmentation fault)的原因是你在使用scanf函数接收输入时,格式化字符串传递的变量类型不正确。scanf函数在接收字符数组类型时,需要使用%s作为格式化字符串,并且传递的是字符指针。而你的代码中使用了单个字符变量来接收,导致了段错误的发生。

另外,还有一个问题是在scanf函数中,传递结构体成员变量时,需要使用取地址符&来获取变量的地址。

下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>

struct Date {
    int year;
    int month; 
    int day;
};

struct Name{
    char name[20];
    int age;
    int first;
    struct Date date1;
    int second;
    struct Date date2;
};

void inputName(struct Name *na);
void printName(struct Name *na);

void inputName(struct Name *na)
{
    printf("请输入姓名:");
    scanf("%s", na->name);
    
    printf("请输入年龄:");
    scanf("%d", &(na->age));
    
    printf("请问是否打过第一针(打过1/没打过0):");
    scanf("%d", &(na->first));
    
    if(na->first == 1){
        printf("请输入第一针日期(yyyy-mm-dd):");
        scanf("%d-%d-%d", &(na->date1.year), &(na->date1.month), &(na->date1.day));
        
        printf("请问是否接种过第二针:(接种1/未接种2)");
        scanf("%d", &(na->second));
        
        if(na->second == 1){
            printf("请输入接种日期(yyyy-mm-dd):");
            scanf("%d-%d-%d", &(na->date2.year), &(na->date2.month), &(na->date2.day));
        }else{
            printf("请尽快接种第二针");
        }
    }else{
        printf("请尽快接种第一针");
    }        
}

void printName(struct Name *na)
{
    printf("姓名:%s,年龄:%d\n", na->name, na->age);
    
    if (na->first == 1){
        printf("接种第一针的时间为%d-%d-%d\n", na->date1.year, na->date1.month, na->date1.day);        
    }else{
        if(na->second == 1){
            printf("接种第二针的时间为%d-%d-%d\n", na->date2.year, na->date2.month, na->date2.day);        
        }else{
            printf("未接种过第二针疫苗\n");
        }
    }
}

int main()
{
    struct Name *n1, *n2, *n3;
        
    n1 = (struct Name *)malloc(sizeof(struct Name));        
    n2 = (struct Name *)malloc(sizeof(struct Name));        
    n3 = (struct Name *)malloc(sizeof(struct Name));        
    
    if(n1 == NULL || n2 == NULL || n3 == NULL){
        printf("内存申请失败");
        exit(1);
    }
    
    inputName(n1); 
    inputName(n2); 
    inputName(n3); 
    
    printName(n1);
    printName(n2);
    printName(n3);

    free(n1);
    free(n3);
    free(n2);

    return 0;        
}

在修改后的代码中,我将接收姓名的字符变量改为了字符数组,并分配了足够的存储空间。同时,在scanf函数中使用了正确的格式化字符串,并传递了正确的变量地址。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-18 15:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表