结构体函数调用问题
为什么性别那里会把邮箱的信息写进去代码放在一楼 本帖最后由 焦糖橙子 于 2022-1-4 18:20 编辑
#include <stdio.h>
#include <stdlib.h>
typedef struct student {
int num;
int age;
char natuve_place;
char gender;
char email;
char QQ;
char name;
char academy;
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);
}
ReviseData函数也有问题176行中的scanf,我还没输入就自动跳下一行了 本帖最后由 jhq999 于 2022-1-4 20:20 编辑
typedef struct student {////////第一个问题
int num;
int age;
char natuve_place;
char gender;////////////输入时必须是1个汉字,占两个字节,最后的字节是给字符串结束标志‘\0’留的
char email;
char QQ;
char name;
char academy;
int grade;
struct student* next;
struct student* prior;
} Student; 第2个问题在调用scanf函数前加fflush(stdin)//清除输入缓存 本帖最后由 焦糖橙子 于 2022-1-5 09:53 编辑
jhq999 发表于 2022-1-4 20:20
第2个问题在调用scanf函数前加
还是会跳过scanf函数
jhq999 发表于 2022-1-4 20:20
第2个问题在调用scanf函数前加
我用DEV-c跑出来了,但是vs里面跑不出来。。。
焦糖橙子 发表于 2022-1-5 09:55
我用DEV-c跑出来了,但是vs里面跑不出来。。。
VS在这里 if (ch == 'Y')设个断点,看看ch的值
或者在它前面加上
printf("%c",ch); 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++上键盘到这一步就不能输入了
jhq999 发表于 2022-1-5 11:47
VS在这里 if (ch == 'Y')设个断点,看看ch的值
或者在它前面加上
printf("%c",ch);
恩?不知道为什么突然正常了,我之前在笔记本上跑,现在用台式。。。
页:
[1]