鱼C论坛

 找回密码
 立即注册
查看: 1237|回复: 15

[已解决]为什么输出会乱码

[复制链接]
发表于 2021-10-26 13:19:51 | 显示全部楼层 |阅读模式

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

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

x
一个学生管理系统
输入 1 张三 60 90 50
#include<stdio.h>
#include<stdlib.h>

typedef struct Student {
        int num;
        char name[10];
        float chinese;
        float math;
        float english;
};

typedef struct node {
        struct Student data;
        struct node* next;
}StudentList;

StudentList* InitList() {    // 初始化单链表
        StudentList* L;
        L = (StudentList*)malloc(sizeof(StudentList));
        L->next = NULL;
}

int InsElem(StudentList* L, struct Student data, int i) {    // 插入元素
        int j = 0;
        StudentList* p = L, * s;
        while (p != NULL && j < i - 1) {
                j++;
                p = p->next;
        }
        if (p == NULL) {
                return 0;
        }
        else {
                s = (StudentList*)malloc(sizeof(StudentList));
                s->data = data;
                s->next = p->next;
                p->next = s;
                return 1;
        }
}

void DispList(StudentList *L) {     // 输出元素
        StudentList* p = L->next;
        while (p) {
                float avg = (p->data.chinese + p->data.math + p->data.english) / 3;
                printf("%d\t%s\t%f\n", p->data.num, p->data.name, avg);
                p = p->next;
        }
}

void main() {
        StudentList* L;
        L = InitList();
        struct Student info;
        printf("请输入学生的学号,姓名,语文成绩,数学成绩,英语成绩\n");
        int i;
        scanf("%d, %s, %f, %f, %f\n", &info.num, &info.name, &info.chinese, &info.math, &info.english);
        InsElem(L, info, 1);
        DispList(L);
}
最佳答案
2021-10-26 15:16:30
村里小黑 发表于 2021-10-26 14:50
蹲个大佬来解答,记得替我一脚,学术不精啊,应该是指针那里出了问题,但是又分析不出来{:10_272 ...
#include<stdio.h>
#include<stdlib.h>

//typedef struct Student {
struct Student {
        int num;
        char name[10];
        float chinese;
        float math;
        float english;
};

typedef struct node {
        struct Student data;
        struct node *next;
} StudentList;

StudentList* InitList() {    // 初始化单链表
        StudentList* L;
        //L = (StudentList*)malloc(sizeof(StudentList));
        L = malloc(sizeof(StudentList));
        L->next = NULL;

        return L;
}

int InsElem(StudentList* L, struct Student data, int i) {    // 插入元素
        int j = 0;
        StudentList *p = L, *s;
        while (p != NULL && j < i - 1) {
                j++;
                p = p->next;
        }
        if (p == NULL) {
                return 0;
        }
        else {
                //s = (StudentList*)malloc(sizeof(StudentList));
                s = malloc(sizeof(StudentList));
                s->data = data;
                s->next = p->next;
                p->next = s;
                return 1;
        }
}

void DispList(StudentList *L) {     // 输出元素
        StudentList* p = L->next;
        while (p) {
                float avg = (p->data.chinese + p->data.math + p->data.english) / 3;
                printf("%d\t%s\t%f\n", p->data.num, p->data.name, avg);
                p = p->next;
        }
}

//void main() {
int main(void) {
        StudentList* L;
        L = InitList();
        struct Student info;
        printf("请输入学生的学号,姓名,语文成绩,数学成绩,英语成绩\n");
        //int i;
        //scanf("%d, %s, %f, %f, %f\n", &info.num, &info.name, &info.chinese, &info.math, &info.english);
        scanf("%d%s%f%f%f", &info.num, info.name, &info.chinese, &info.math, &info.english);
        InsElem(L, info, 1);
        DispList(L);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-26 13:20:24 | 显示全部楼层
输出是 学号 姓名 平均成绩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 13:24:20 | 显示全部楼层
数据结构 头疼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 13:40:15 | 显示全部楼层

是很难,不过都选C了,不学好真的对不起自己
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 14:09:31 | 显示全部楼层
a327904410 发表于 2021-10-26 13:40
是很难,不过都选C了,不学好真的对不起自己

上学期学这个差点没了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 14:50:42 | 显示全部楼层
蹲个大佬来解答,记得替我一脚,学术不精啊,应该是指针那里出了问题,但是又分析不出来(也有可能分析错了)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 15:16:30 | 显示全部楼层    本楼为最佳答案   
村里小黑 发表于 2021-10-26 14:50
蹲个大佬来解答,记得替我一脚,学术不精啊,应该是指针那里出了问题,但是又分析不出来{:10_272 ...
#include<stdio.h>
#include<stdlib.h>

//typedef struct Student {
struct Student {
        int num;
        char name[10];
        float chinese;
        float math;
        float english;
};

typedef struct node {
        struct Student data;
        struct node *next;
} StudentList;

StudentList* InitList() {    // 初始化单链表
        StudentList* L;
        //L = (StudentList*)malloc(sizeof(StudentList));
        L = malloc(sizeof(StudentList));
        L->next = NULL;

        return L;
}

int InsElem(StudentList* L, struct Student data, int i) {    // 插入元素
        int j = 0;
        StudentList *p = L, *s;
        while (p != NULL && j < i - 1) {
                j++;
                p = p->next;
        }
        if (p == NULL) {
                return 0;
        }
        else {
                //s = (StudentList*)malloc(sizeof(StudentList));
                s = malloc(sizeof(StudentList));
                s->data = data;
                s->next = p->next;
                p->next = s;
                return 1;
        }
}

void DispList(StudentList *L) {     // 输出元素
        StudentList* p = L->next;
        while (p) {
                float avg = (p->data.chinese + p->data.math + p->data.english) / 3;
                printf("%d\t%s\t%f\n", p->data.num, p->data.name, avg);
                p = p->next;
        }
}

//void main() {
int main(void) {
        StudentList* L;
        L = InitList();
        struct Student info;
        printf("请输入学生的学号,姓名,语文成绩,数学成绩,英语成绩\n");
        //int i;
        //scanf("%d, %s, %f, %f, %f\n", &info.num, &info.name, &info.chinese, &info.math, &info.english);
        scanf("%d%s%f%f%f", &info.num, info.name, &info.chinese, &info.math, &info.english);
        InsElem(L, info, 1);
        DispList(L);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 16:21:01 | 显示全部楼层

主要是因为初始化单链表之后没有返回指针?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 16:34:19 | 显示全部楼层
村里小黑 发表于 2021-10-26 16:21
主要是因为初始化单链表之后没有返回指针?

这个问题不好回答,我感觉没有 “主要” 这么一说
代码中任何一个字母错了都不行
我感觉不能说这个字母错的比那个字母主要

代码中的问题我都是注释了原来的代码,然后改的,当然还有添加的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 16:47:59 | 显示全部楼层
人造人 发表于 2021-10-26 16:34
这个问题不好回答,我感觉没有 “主要” 这么一说
代码中任何一个字母错了都不行
我感觉不能说这个字母 ...

但是我觉得L = (StudentList*)malloc(sizeof(StudentList));这一句没啥问题啊,
申请空间后返回一个void指针赋值给Students型指针L和返回转换成Students型指针在赋值给Students型指针L都没问题吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 17:00:27 | 显示全部楼层
村里小黑 发表于 2021-10-26 16:47
但是我觉得L = (StudentList*)malloc(sizeof(StudentList));这一句没啥问题啊,
申请空间后返回一个void ...


我明白了,我确实是有一些犯二了,感谢大佬赐教,以后我也多注意这些细节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 17:01:15 | 显示全部楼层
人造人 发表于 2021-10-26 16:34
这个问题不好回答,我感觉没有 “主要” 这么一说
代码中任何一个字母错了都不行
我感觉不能说这个字母 ...

我明白了,我确实是有一些犯二了,感谢大佬赐教,以后我也多注意这些细节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 17:47:24 | 显示全部楼层
村里小黑 发表于 2021-10-26 16:47
但是我觉得L = (StudentList*)malloc(sizeof(StudentList));这一句没啥问题啊,
申请空间后返回一个void ...

C语言中不需要这个转换,没有任何必要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 18:08:57 | 显示全部楼层

看了你的代码后我知道我哪里错了,是输入格式错了,明明里面有逗号隔开我还用空格隔开,我真是个大傻逼。不过还是谢谢你帮我改了下代码,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 18:09:29 | 显示全部楼层
jackz007 发表于 2021-10-26 16:03
编译、运行实况:

感谢,辛苦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 18:10:51 | 显示全部楼层
村里小黑 发表于 2021-10-26 16:21
主要是因为初始化单链表之后没有返回指针?

知道哪里错了,代码没错,是我的输入格式错了。输入里面用逗号隔开的,而我用空格隔开,导致输出结果乱码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 18:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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