鱼C论坛

 找回密码
 立即注册
查看: 661|回复: 9

[已解决]结构体函数调用问题

[复制链接]
发表于 2022-1-4 18:17:58 | 显示全部楼层 |阅读模式

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

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

x
为什么性别那里会把邮箱的信息写进去
代码放在一楼
最佳答案
2022-1-4 20:17:04
本帖最后由 jhq999 于 2022-1-4 20:20 编辑
typedef struct student {////////第一个问题
        int num;
        int age;
        char natuve_place[50];
        char gender[3];////////////输入时必须是1个汉字,占两个字节,最后的字节是给字符串结束标志‘\0’留的
        char email[20];
        char QQ[15];
        char name[20];
        char academy[30];
        int grade;
        struct student* next;
        struct student* prior;
} Student;
uTools_1641291416753.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-4 18:18:32 | 显示全部楼层
本帖最后由 焦糖橙子 于 2022-1-4 18:20 编辑
#include <stdio.h>
#include <stdlib.h>

typedef struct student {
        int num;
        int age;
        char natuve_place[50];
        char gender[2];
        char email[20];
        char QQ[15];
        char name[20];
        char academy[30];
        int grade;
        struct student* next;
        struct student* prior;
} Student;

void DeletData(Student*, int);//删除数据
void CrateData(Student*);//增加数据
Student* ChcekData(Student*, int);//查看数据
void ReviseData(Student*, int);//修改数据
void PrintfData(Student*, int);//打印数据

int main() {
        int input, num, flag = 1;
        Student* temp = (Student*)malloc(sizeof(Student));
        Student* pStu, * PStu;
        pStu = (Student*)malloc(sizeof(Student));
        pStu->next = NULL;
        pStu->prior = NULL;
        PStu = (Student*)malloc(sizeof(Student));
        pStu = PStu;
        while (flag) {
                printf("\n****************************************\n");
                printf("1.删除学生信息\n");
                printf("2.新增学生信息\n");
                printf("3.查询学生信息\n");
                printf("4.修改学生信息\n");
                printf("5.打印学生信息\n");
                printf("0.结束程序\n");
                printf("请输入操作指令:");
                scanf("%d", &input);
                if (input != 0) {
                        printf("请输入学生学号:");
                        scanf("%d", &num);
                }
                else
                        flag = 0;
                putchar('\n');
                switch (input) {
                case 1:
                        DeletData(pStu, num);
                        break;
                case 2:
                        CrateData(pStu);
                        break;
                case 3:
                        temp = ChcekData(pStu, num);
                        printf("\n学生的姓名:%s", temp->name);
                        printf("\n学生的学号:%d", temp->num);
                        printf("\n学生的年龄:%d", temp->age);
                        printf("\n学生的性别:%s", temp->gender);
                        printf("\n学生的籍贯:%s", temp->natuve_place);
                        printf("\n学生的邮箱:%s", temp->email);
                        printf("\n学生的QQ:%s", temp->QQ);
                        printf("\n学生的学院:%s", temp->academy);
                        printf("\n学生的年级:%d", temp->grade);
                        break;
                case 4:
                        ReviseData(pStu, num);
                        break;
                case 5:
                        PrintfData(pStu, num);
                        break;
                case 0:
                        flag = 0;
                        break;
                default:
                        printf("请输入正确的数字!\n");
                        break;
                }
        }

        return 0;
}

void DeletData(Student* pStu, int num) {

        Student* temp = (Student*)malloc(sizeof(Student));
        temp = ChcekData(pStu, num);
        temp->prior->next = temp->next;
        temp->next->prior = temp->prior;

}

Student* ChcekData(Student* p, int num) {
        while (p) {

                if (p->num == num)
                        return p;
                else
                        p = p->next;
        }
        printf("查无此人\n");
}

void CrateData(Student* pStu) { //pStu是头指针



        Student* n_student = (Student*)malloc(sizeof(Student));

        printf("请输入学生的姓名:");
        scanf(" %s", &n_student->name);

        printf("请输入学生的学号:");
        scanf(" %d", &n_student->num);

        printf("请输入学生的性别:");
        scanf(" %s", &n_student->gender);

        printf("请输入学生的年龄:");
        scanf(" %d", &n_student->age);
        
        printf("请输入学生的籍贯:");
        scanf(" %s", &n_student->natuve_place);

        printf("请输入学生的邮箱:");
        scanf(" %s", &n_student->email);

        printf("请输入学生的QQ:");
        scanf(" %s", &n_student->QQ);

        printf("请输入学生的学院:");
        scanf("%s", &n_student->academy);

        printf("请输入学生的年级:");
        scanf(" %d", &n_student->grade);

        if (!pStu->prior) {
                n_student->prior = pStu;
                pStu->prior = n_student;
                n_student->next = pStu;
                pStu->next = n_student;
        }
        else {
                n_student->prior = pStu;
                pStu->prior = n_student;
                n_student->next = pStu;
                pStu->next = n_student;
        }
        printf("\n成功创建!\n");

}

void ReviseData(Student* pStu, int num) {

        Student* temp = (Student*)malloc(sizeof(Student));
        temp = ChcekData(pStu, num);

        printf("当前学生信息如下:\n");
        printf("\n学生的姓名:%s", temp->name);
        printf("\n学生的学号:%d", temp->num);
        printf("\n学生的年龄:%d", temp->age);
        printf("\n学生的性别:%s", temp->gender);
        printf("\n学生的籍贯:%s", temp->natuve_place);
        printf("\n学生的邮箱:%s", temp->email);
        printf("\n学生的QQ:%s", temp->QQ);
        printf("\n学生的学院:%s", temp->academy);
        printf("\n学生的年级:%d", temp->grade);

        char ch;
        printf("是否确认修改?(Y/N)");
        scanf("%c", &ch);
        if (ch == 'Y')
        {

                printf("请输入学生的姓名:");
                scanf(" %s", &temp->name);

                printf("请输入学生的学号:");
                scanf(" %d", &temp->num);

                printf("请输入学生的性别:");
                scanf(" %s", &temp->gender);

                printf("请输入学生的年龄:");
                scanf(" %d", &temp->age);
                
                printf("请输入学生的籍贯:");
                scanf(" %s", &temp->natuve_place);

                printf("请输入学生的邮箱:");
                scanf(" %s", &temp->email);

                printf("请输入学生的QQ:");
                scanf(" %s", &temp->QQ);

                printf("请输入学生的学院:");
                scanf(" %s", &temp->academy);

                printf("请输入学生的年级:");
                scanf(" %d", &temp->grade);

                printf("修改成功,修改后结果如下:\n");
                printf("\n学生的姓名:%s", temp->name);
                printf("\n学生的学号:%d", temp->num);
                printf("\n学生的年龄:%d", temp->age);
                printf("\n学生的性别:%s", temp->gender);
                printf("\n学生的籍贯:%s", temp->natuve_place);
                printf("\n学生的邮箱:%s", temp->email);
                printf("\n学生的QQ:%s", temp->QQ);
                printf("\n学生的学院:%s", temp->academy);
                printf("\n学生的年级:%d", temp->grade);
        }
}

void PrintfData(Student* pStu, int num) {
        Student* temp = (Student*)malloc(sizeof(Student));
        temp = ChcekData(pStu, num);
        printf("学生姓名:%s  学生学号:%d\n", temp->name, temp->num);
        printf("学生年龄:%d  学生性别:%s\n", temp->age, temp->gender);
        printf("学生籍贯:%s  学生邮箱:%d\n", temp->natuve_place, temp->email);
        printf("学生QQ:%s  学生学院:%d  学生年级:%d\n", temp->academy, temp->grade);


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

使用道具 举报

 楼主| 发表于 2022-1-4 18:35:46 | 显示全部楼层
ReviseData函数也有问题176行中的scanf,我还没输入就自动跳下一行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-4 20:17:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-1-4 20:20 编辑
typedef struct student {////////第一个问题
        int num;
        int age;
        char natuve_place[50];
        char gender[3];////////////输入时必须是1个汉字,占两个字节,最后的字节是给字符串结束标志‘\0’留的
        char email[20];
        char QQ[15];
        char name[20];
        char academy[30];
        int grade;
        struct student* next;
        struct student* prior;
} Student;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-4 20:20:17 | 显示全部楼层
第2个问题在调用scanf函数前加
fflush(stdin)//清除输入缓存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 09:51:31 | 显示全部楼层
本帖最后由 焦糖橙子 于 2022-1-5 09:53 编辑
jhq999 发表于 2022-1-4 20:20
第2个问题在调用scanf函数前加


还是会跳过scanf函数

Screenshot 2022-01-05 095241.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 09:55:33 | 显示全部楼层
jhq999 发表于 2022-1-4 20:20
第2个问题在调用scanf函数前加

我用DEV-c跑出来了,但是vs里面跑不出来。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 11:47:29 | 显示全部楼层
焦糖橙子 发表于 2022-1-5 09:55
我用DEV-c跑出来了,但是vs里面跑不出来。。。

VS在这里 if (ch == 'Y')设个断点,看看ch的值
或者在它前面加上
printf("%c",ch);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 21:07:47 | 显示全部楼层
jhq999 发表于 2022-1-5 11:47
VS在这里 if (ch == 'Y')设个断点,看看ch的值
或者在它前面加上
printf("%c",ch);
char ch;
        printf("\n是否确认修改?(Y/N)");
        fflush(stdin);//清除输入缓存
        scanf("%c", &ch);
        printf("%c",ch); 

改成这样子,但是在DEV-C++上键盘到这一步就不能输入了
屏幕截图 2022-01-05 210504.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 21:10:29 | 显示全部楼层
jhq999 发表于 2022-1-5 11:47
VS在这里 if (ch == 'Y')设个断点,看看ch的值
或者在它前面加上
printf("%c",ch);

恩?不知道为什么突然正常了,我之前在笔记本上跑,现在用台式。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-1 23:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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