鱼C论坛

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

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

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

#define NUM 2
#define LEN sizeof(struct Info)
#define N 100
#define O 4


//学生基本信息
typedef struct Info{
        int num;
        char *name;
        char sex;
        char job;
        union {
                int class;
                char occupation[O];
        };
}temp;

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

int main() {
        struct Info Information[NUM];
        for (int i = 0; i < NUM; i++)
        {
                input(Information[i]);
        }

        print(Information);
}

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

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

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

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

        getchar();

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

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

                printf("Please give me the occupation:");
                char str2[O];
                getchar();
                gets(str2);
                strcpy(Information.occupation, str2);
        }
        else {
                printf("输入错!");
                return;
        }
        printf("\n");
}

//打印学生基本信息
void print(struct Info p[]) {
        printf("num\tname\tsex\tjob\tclass/occupation\n");
        int i = 0;
        while (i < NUM) {
                if (p[i].job == 't') {
                        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);
                }
                else {
                        printf("%d\t%s\t%c\t%c\t", p[i].num, p[i].name, p[i].sex, p[i].job);
                        puts(p[i].occupation);
                }
                i++;
        }
}
最佳答案
2024-11-28 21:41:29
以下是对您的代码出现问题的分析和修改建议:

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

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

以下是修正后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUM 2
#define N 100

typedef struct Info{
        int num;
        char name[N];
        char sex;
        char job;
        union {
                int class;
                char occupation[N];
        };
} Info;

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

int main() {
        Info information[NUM];
        for (int i = 0; i < NUM; i++) {
                input(&information[i]);
        }
        print(information, NUM);
        return 0;
}

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

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

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

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

        if (information->job == 's') {
                printf("Please give me the class: ");
                scanf("%d", &information->class);
                getchar();
        }
        else if (information->job == 't') {
                printf("Please give me the occupation: ");
                getchar();
                fgets(information->occupation, N, stdin);
                information->occupation[strcspn(information->occupation, "\n")] = '\0'; // Remove newline
        }
        else {
                printf("输入错误!\n");
        }
        printf("\n");
}

//打印学生基本信息
void print(Info p[], int n) {
        printf("num\tname\tsex\tjob\tclass/occupation\n");
        for (int i = 0; i < n; i++) {
                if (p[i].job == 't') {
                        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);
                } else {
                        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);
                }
        }
}

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

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

最佳答案

查看完整内容

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

使用道具 举报

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

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

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

以下是修正后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUM 2
#define N 100

typedef struct Info{
        int num;
        char name[N];
        char sex;
        char job;
        union {
                int class;
                char occupation[N];
        };
} Info;

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

int main() {
        Info information[NUM];
        for (int i = 0; i < NUM; i++) {
                input(&information[i]);
        }
        print(information, NUM);
        return 0;
}

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

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

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

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

        if (information->job == 's') {
                printf("Please give me the class: ");
                scanf("%d", &information->class);
                getchar();
        }
        else if (information->job == 't') {
                printf("Please give me the occupation: ");
                getchar();
                fgets(information->occupation, N, stdin);
                information->occupation[strcspn(information->occupation, "\n")] = '\0'; // Remove newline
        }
        else {
                printf("输入错误!\n");
        }
        printf("\n");
}

//打印学生基本信息
void print(Info p[], int n) {
        printf("num\tname\tsex\tjob\tclass/occupation\n");
        for (int i = 0; i < n; i++) {
                if (p[i].job == 't') {
                        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);
                } else {
                        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);
                }
        }
}

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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