鱼C论坛

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

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

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

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

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

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

  3. struct Date {
  4.         int year;
  5.         int month;
  6.         int day;
  7.         };

  8. struct Name{
  9.         char name[40];
  10.         int age;
  11.         int first;
  12.         struct Date date1;
  13.         int second ;
  14.         struct Date date2;
  15.         };

  16. void inputName(struct Name *na);
  17. void printName(struct Name *na);

  18. void inputName(struct Name *na)
  19. {
  20.         printf("请输入姓名:");
  21.         scanf("%s",na->name);
  22.         printf("请输入年龄:");
  23.         scanf("%d",na->age);
  24.         printf("请问是否打过第一针(打过1/没打过0):");
  25.         scanf("%d",na->first);
  26.         if(na->first == 1){
  27.                 printf("请输入第一针日期(yyyy-mm-dd):");
  28.                 scanf("%d-%d-%d",na->date1.year,na->date1.month,na->date1.day);
  29.                 printf("请问是否接种过第二针:(接种1/未接种2)");
  30.                 scanf("%d",na->second);
  31.                 if(na->second == 0)
  32.                 {
  33.                         printf("请尽快接种第二针");
  34.                 }else{
  35.                         printf("请输入接种日期(yyyy-mm-dd):");
  36.                         scanf("%d-%d-%d",na->date2.year,na->date2.month,na->date2.day);
  37.                 }
  38.         }else{
  39.                 printf("请尽快接种第一针");
  40.         }       
  41. }

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

  55.         printf("未接种过过疫苗\n");       
  56.         }
  57.        
  58. }

  59. int main()
  60. {
  61.         struct Name *n1,*n2,*n3;
  62.        
  63.         n1 = (struct Name *)malloc(sizeof(struct Name));       
  64.         n2 = (struct Name *)malloc(sizeof(struct Name));       
  65.         n3 = (struct Name *)malloc(sizeof(struct Name));       
  66.         if(n1 == NULL || n2 == NULL || n3 == NULL)
  67.         {
  68.                 printf("内存申请失败");
  69.                 exit(1);
  70.         }
  71.         inputName(n1);
  72.         inputName(n2);
  73.         inputName(n3);
  74.        
  75.         printName(n1);
  76.         printName(n2);
  77.         printName(n3);

  78.         free(n1);
  79.         free(n3);
  80.         free(n2);

  81.         return 0;       
  82. }
复制代码

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

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

下面是修改后的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct Date {
  4.     int year;
  5.     int month;
  6.     int day;
  7. };

  8. struct Name{
  9.     char name[20];
  10.     int age;
  11.     int first;
  12.     struct Date date1;
  13.     int second;
  14.     struct Date date2;
  15. };

  16. void inputName(struct Name *na);
  17. void printName(struct Name *na);

  18. void inputName(struct Name *na)
  19. {
  20.     printf("请输入姓名:");
  21.     scanf("%s", na->name);
  22.    
  23.     printf("请输入年龄:");
  24.     scanf("%d", &(na->age));
  25.    
  26.     printf("请问是否打过第一针(打过1/没打过0):");
  27.     scanf("%d", &(na->first));
  28.    
  29.     if(na->first == 1){
  30.         printf("请输入第一针日期(yyyy-mm-dd):");
  31.         scanf("%d-%d-%d", &(na->date1.year), &(na->date1.month), &(na->date1.day));
  32.         
  33.         printf("请问是否接种过第二针:(接种1/未接种2)");
  34.         scanf("%d", &(na->second));
  35.         
  36.         if(na->second == 1){
  37.             printf("请输入接种日期(yyyy-mm-dd):");
  38.             scanf("%d-%d-%d", &(na->date2.year), &(na->date2.month), &(na->date2.day));
  39.         }else{
  40.             printf("请尽快接种第二针");
  41.         }
  42.     }else{
  43.         printf("请尽快接种第一针");
  44.     }       
  45. }

  46. void printName(struct Name *na)
  47. {
  48.     printf("姓名:%s,年龄:%d\n", na->name, na->age);
  49.    
  50.     if (na->first == 1){
  51.         printf("接种第一针的时间为%d-%d-%d\n", na->date1.year, na->date1.month, na->date1.day);       
  52.     }else{
  53.         if(na->second == 1){
  54.             printf("接种第二针的时间为%d-%d-%d\n", na->date2.year, na->date2.month, na->date2.day);       
  55.         }else{
  56.             printf("未接种过第二针疫苗\n");
  57.         }
  58.     }
  59. }

  60. int main()
  61. {
  62.     struct Name *n1, *n2, *n3;
  63.        
  64.     n1 = (struct Name *)malloc(sizeof(struct Name));       
  65.     n2 = (struct Name *)malloc(sizeof(struct Name));       
  66.     n3 = (struct Name *)malloc(sizeof(struct Name));       
  67.    
  68.     if(n1 == NULL || n2 == NULL || n3 == NULL){
  69.         printf("内存申请失败");
  70.         exit(1);
  71.     }
  72.    
  73.     inputName(n1);
  74.     inputName(n2);
  75.     inputName(n3);
  76.    
  77.     printName(n1);
  78.     printName(n2);
  79.     printName(n3);

  80.     free(n1);
  81.     free(n3);
  82.     free(n2);

  83.     return 0;       
  84. }
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

下面是修改后的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct Date {
  4.     int year;
  5.     int month;
  6.     int day;
  7. };

  8. struct Name{
  9.     char name[20];
  10.     int age;
  11.     int first;
  12.     struct Date date1;
  13.     int second;
  14.     struct Date date2;
  15. };

  16. void inputName(struct Name *na);
  17. void printName(struct Name *na);

  18. void inputName(struct Name *na)
  19. {
  20.     printf("请输入姓名:");
  21.     scanf("%s", na->name);
  22.    
  23.     printf("请输入年龄:");
  24.     scanf("%d", &(na->age));
  25.    
  26.     printf("请问是否打过第一针(打过1/没打过0):");
  27.     scanf("%d", &(na->first));
  28.    
  29.     if(na->first == 1){
  30.         printf("请输入第一针日期(yyyy-mm-dd):");
  31.         scanf("%d-%d-%d", &(na->date1.year), &(na->date1.month), &(na->date1.day));
  32.         
  33.         printf("请问是否接种过第二针:(接种1/未接种2)");
  34.         scanf("%d", &(na->second));
  35.         
  36.         if(na->second == 1){
  37.             printf("请输入接种日期(yyyy-mm-dd):");
  38.             scanf("%d-%d-%d", &(na->date2.year), &(na->date2.month), &(na->date2.day));
  39.         }else{
  40.             printf("请尽快接种第二针");
  41.         }
  42.     }else{
  43.         printf("请尽快接种第一针");
  44.     }       
  45. }

  46. void printName(struct Name *na)
  47. {
  48.     printf("姓名:%s,年龄:%d\n", na->name, na->age);
  49.    
  50.     if (na->first == 1){
  51.         printf("接种第一针的时间为%d-%d-%d\n", na->date1.year, na->date1.month, na->date1.day);       
  52.     }else{
  53.         if(na->second == 1){
  54.             printf("接种第二针的时间为%d-%d-%d\n", na->date2.year, na->date2.month, na->date2.day);       
  55.         }else{
  56.             printf("未接种过第二针疫苗\n");
  57.         }
  58.     }
  59. }

  60. int main()
  61. {
  62.     struct Name *n1, *n2, *n3;
  63.        
  64.     n1 = (struct Name *)malloc(sizeof(struct Name));       
  65.     n2 = (struct Name *)malloc(sizeof(struct Name));       
  66.     n3 = (struct Name *)malloc(sizeof(struct Name));       
  67.    
  68.     if(n1 == NULL || n2 == NULL || n3 == NULL){
  69.         printf("内存申请失败");
  70.         exit(1);
  71.     }
  72.    
  73.     inputName(n1);
  74.     inputName(n2);
  75.     inputName(n3);
  76.    
  77.     printName(n1);
  78.     printName(n2);
  79.     printName(n3);

  80.     free(n1);
  81.     free(n3);
  82.     free(n2);

  83.     return 0;       
  84. }
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 12:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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