鱼C论坛

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

[已解决]学生和老师信息录入和打印

[复制链接]
发表于 2024-11-28 21:41:28 | 显示全部楼层 |阅读模式
1鱼币
代码调了好几天调不出来,主要有以下几个问题
1、用结构体数组的话在打印时会出现访问冲突(如下代码)
2、用链表的话,最后打印出来的class和occupation为符号和数字(即不正确)

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

  4. #define NUM 2
  5. #define LEN sizeof(struct Info)
  6. #define N 100
  7. #define O 4


  8. //学生基本信息
  9. typedef struct Info{
  10.         int num;
  11.         char *name;
  12.         char sex;
  13.         char job;
  14.         union {
  15.                 int class;
  16.                 char occupation[O];
  17.         };
  18. }temp;

  19. struct Info input(temp Information);
  20. void print(struct Info p[]);

  21. int main() {
  22.         struct Info Information[NUM];
  23.         for (int i = 0; i < NUM; i++)
  24.         {
  25.                 input(Information[i]);
  26.         }

  27.         print(Information);
  28. }

  29. //输入学生基本信息
  30. struct Info input(temp Information){
  31.         char str[N];

  32.         printf("Please give me the num:");
  33.         scanf("%d", &Information.num);
  34.         getchar();

  35.         printf("Please give me the name:");
  36.         gets(str);
  37.         Information.name = (char*)malloc(sizeof(str) + 1);
  38.         strcpy(Information.name, str);

  39.         printf("Please give me the sex(M/F):");
  40.         scanf_s("%c", &Information.sex);

  41.         getchar();

  42.         printf("Please give me the job(s/t):");
  43.         scanf("%c", &Information.job);

  44.         if (Information.job == 's') {
  45.                 printf("Please give me the class:");
  46.                 scanf("%d", &Information.class);
  47.         }
  48.         else if (Information.job == 't') {

  49.                 printf("Please give me the occupation:");
  50.                 char str2[O];
  51.                 getchar();
  52.                 gets(str2);
  53.                 strcpy(Information.occupation, str2);
  54.         }
  55.         else {
  56.                 printf("输入错!");
  57.                 return;
  58.         }
  59.         printf("\n");
  60. }

  61. //打印学生基本信息
  62. void print(struct Info p[]) {
  63.         printf("num\tname\tsex\tjob\tclass/occupation\n");
  64.         int i = 0;
  65.         while (i < NUM) {
  66.                 if (p[i].job == 't') {
  67.                         printf("%d\t%s\t%c\t%c\t%d\n", p[i].num, p[i].name, p[i].sex, p[i].job, p[i].class);
  68.                 }
  69.                 else {
  70.                         printf("%d\t%s\t%c\t%c\t", p[i].num, p[i].name, p[i].sex, p[i].job);
  71.                         puts(p[i].occupation);
  72.                 }
  73.                 i++;
  74.         }
  75. }
复制代码
最佳答案
2024-11-28 21:41:29
以下是对您的代码出现问题的分析和修改建议:

1. **访问冲突问题:**
   - 访问冲突可能是由于在输入和操作字符数组时,您使用 `char *` 而没有正确地分配内存或处理字符串。
   - 在 `input` 函数中, `str` 是一个单字符变量,而不是字符串数组。应使用字符数组来读取和存储字符串。

2. **链表中的错误数据:**
   - 在访问和使用字符串或未正确初始化的结构时可能会出现此类问题。

以下是修正后的代码:

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

  4. #define NUM 2
  5. #define N 100

  6. typedef struct Info{
  7.         int num;
  8.         char name[N];
  9.         char sex;
  10.         char job;
  11.         union {
  12.                 int class;
  13.                 char occupation[N];
  14.         };
  15. } Info;

  16. void input(Info *information);
  17. void print(Info p[], int n);

  18. int main() {
  19.         Info information[NUM];
  20.         for (int i = 0; i < NUM; i++) {
  21.                 input(&information[i]);
  22.         }
  23.         print(information, NUM);
  24.         return 0;
  25. }

  26. //输入学生基本信息
  27. void input(Info *information){
  28.         printf("Please give me the num: ");
  29.         scanf("%d", &information->num);
  30.         getchar();

  31.         printf("Please give me the name: ");
  32.         fgets(information->name, N, stdin);
  33.         information->name[strcspn(information->name, "\n")] = '\0'; // Remove newline

  34.         printf("Please give me the sex(M/F): ");
  35.         scanf("%c", &information->sex);
  36.         getchar();

  37.         printf("Please give me the job (s/t): ");
  38.         scanf("%c", &information->job);

  39.         if (information->job == 's') {
  40.                 printf("Please give me the class: ");
  41.                 scanf("%d", &information->class);
  42.                 getchar();
  43.         }
  44.         else if (information->job == 't') {
  45.                 printf("Please give me the occupation: ");
  46.                 getchar();
  47.                 fgets(information->occupation, N, stdin);
  48.                 information->occupation[strcspn(information->occupation, "\n")] = '\0'; // Remove newline
  49.         }
  50.         else {
  51.                 printf("输入错误!\n");
  52.         }
  53.         printf("\n");
  54. }

  55. //打印学生基本信息
  56. void print(Info p[], int n) {
  57.         printf("num\tname\tsex\tjob\tclass/occupation\n");
  58.         for (int i = 0; i < n; i++) {
  59.                 if (p[i].job == 't') {
  60.                         printf("%d\t%s\t%c\t%c\t%s\n", p[i].num, p[i].name, p[i].sex, p[i].job, p[i].occupation);
  61.                 } else {
  62.                         printf("%d\t%s\t%c\t%c\t%d\n", p[i].num, p[i].name, p[i].sex, p[i].job, p[i].class);
  63.                 }
  64.         }
  65. }
复制代码


**修改说明:**
- 使用字符数组 `char name[N]` 和 `char occupation[N]` 以避免动态分配字符串引起的错误。
- `fgets()` 用于读取字符串,以防止缓冲区溢出,并除去换行符。
- **建议:** 在遇到涉及动态内存和字符串操作时,小心使用指针和内存管理,以避免常见错误。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

最佳答案

查看完整内容

以下是对您的代码出现问题的分析和修改建议: 1. **访问冲突问题:** - 访问冲突可能是由于在输入和操作字符数组时,您使用 `char *` 而没有正确地分配内存或处理字符串。 - 在 `input` 函数中, `str` 是一个单字符变量,而不是字符串数组。应使用字符数组来读取和存储字符串。 2. **链表中的错误数据:** - 在访问和使用字符串或未正确初始化的结构时可能会出现此类问题。 以下是修正后的代码: ** ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-11-28 21:41:29 | 显示全部楼层    本楼为最佳答案   
以下是对您的代码出现问题的分析和修改建议:

1. **访问冲突问题:**
   - 访问冲突可能是由于在输入和操作字符数组时,您使用 `char *` 而没有正确地分配内存或处理字符串。
   - 在 `input` 函数中, `str` 是一个单字符变量,而不是字符串数组。应使用字符数组来读取和存储字符串。

2. **链表中的错误数据:**
   - 在访问和使用字符串或未正确初始化的结构时可能会出现此类问题。

以下是修正后的代码:

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

  4. #define NUM 2
  5. #define N 100

  6. typedef struct Info{
  7.         int num;
  8.         char name[N];
  9.         char sex;
  10.         char job;
  11.         union {
  12.                 int class;
  13.                 char occupation[N];
  14.         };
  15. } Info;

  16. void input(Info *information);
  17. void print(Info p[], int n);

  18. int main() {
  19.         Info information[NUM];
  20.         for (int i = 0; i < NUM; i++) {
  21.                 input(&information[i]);
  22.         }
  23.         print(information, NUM);
  24.         return 0;
  25. }

  26. //输入学生基本信息
  27. void input(Info *information){
  28.         printf("Please give me the num: ");
  29.         scanf("%d", &information->num);
  30.         getchar();

  31.         printf("Please give me the name: ");
  32.         fgets(information->name, N, stdin);
  33.         information->name[strcspn(information->name, "\n")] = '\0'; // Remove newline

  34.         printf("Please give me the sex(M/F): ");
  35.         scanf("%c", &information->sex);
  36.         getchar();

  37.         printf("Please give me the job (s/t): ");
  38.         scanf("%c", &information->job);

  39.         if (information->job == 's') {
  40.                 printf("Please give me the class: ");
  41.                 scanf("%d", &information->class);
  42.                 getchar();
  43.         }
  44.         else if (information->job == 't') {
  45.                 printf("Please give me the occupation: ");
  46.                 getchar();
  47.                 fgets(information->occupation, N, stdin);
  48.                 information->occupation[strcspn(information->occupation, "\n")] = '\0'; // Remove newline
  49.         }
  50.         else {
  51.                 printf("输入错误!\n");
  52.         }
  53.         printf("\n");
  54. }

  55. //打印学生基本信息
  56. void print(Info p[], int n) {
  57.         printf("num\tname\tsex\tjob\tclass/occupation\n");
  58.         for (int i = 0; i < n; i++) {
  59.                 if (p[i].job == 't') {
  60.                         printf("%d\t%s\t%c\t%c\t%s\n", p[i].num, p[i].name, p[i].sex, p[i].job, p[i].occupation);
  61.                 } else {
  62.                         printf("%d\t%s\t%c\t%c\t%d\n", p[i].num, p[i].name, p[i].sex, p[i].job, p[i].class);
  63.                 }
  64.         }
  65. }
复制代码


**修改说明:**
- 使用字符数组 `char name[N]` 和 `char occupation[N]` 以避免动态分配字符串引起的错误。
- `fgets()` 用于读取字符串,以防止缓冲区溢出,并除去换行符。
- **建议:** 在遇到涉及动态内存和字符串操作时,小心使用指针和内存管理,以避免常见错误。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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