void menu(void); void fun(void(*p)(void)); void fun1(void); void fun2(void); void fun3(void); void fun4(void); struct student{ int id; char name[10]; char gender[5]; float score; }; int count = 0; struct student stu[N]; int main(void) { int input_num; struct student stu[N]; while(1){ menu(); printf("请输入:"); scanf("%d",&input_num); if (1 == input_num || 2 == input_num || 3 == input_num || 4 == input_num || 5 == input_num) switch (input_num) { case 1: fun(fun1); break; case 2: fun(fun2); break; case 3: fun(fun3); break; // case 4: // fun(fun4); case 5: printf("感谢使用\n"); exit(0); break; } else printf("输入错误\n"); } return 0; } void fun1(void) { // char s[5]; printf("请输入学生信息(学号、姓名、性别、成绩\n"); //while(scanf("%s",s) != EOF){ scanf("%d%s%s%f",&stu[count].id,stu[count].name,stu[count].gender,&stu[count].score); count++; // } } void fun2(void) { int i; for(i=0;i<count;i++) printf("学号:%d 姓名:%s 性别:%s 成绩:%f\n",stu[i].id, stu[i].name, stu[i].gender, stu[i].score); } void fun3(void) { int seek_num,i; printf("请输入学号\n"); scanf("%d",&seek_num); for(i=0;i<count;i++) { if(stu[i].id == seek_num) printf("本次搜索学生的信息如下\n学号:%d 姓名:%s 性别:%s 成绩:%f\n",stu[i].id, stu[i].name, stu[i].gender, stu[i].score); } } void fun4(void) { int del_id,i=0; struct student * del_p = stu[N]; struct student * new_p = stu[N]; printf("请输入要删除的学生的学号"); scanf("%d",&del_id); while (i < count) { if(*del_p->id == del_id) { del_p++; i++; } *del_q->id = *del_p->id; *del_q->name = *del_p->name; *del_q->gender = *del_p->gender; *del_q->score = *del_p->score; i++; del_p++; del_q++; } } void fun(void(*p)(void)) { p(); } void menu(void) { printf("|====================================|\n"); printf("| 学 生 管 理 系 统 |\n"); printf("|====================================|\n"); printf("| 1.录入学生信息 |\n"); printf("| 2.查询已录入学生信息 |\n"); printf("| 3.搜索学生信息 |\n"); printf("| 4.删除学生信息 |\n"); printf("| 5.退出程序 |\n"); printf("|====================================|\n"); }为什么我的fun4有问题
时间: 2023-08-11 16:05:28 浏览: 162
根据你提供的代码,可以看出`fun4`存在以下问题:
1. `del_p`和`del_q`没有被初始化,不能直接取值或者赋值。应该使用`&stu[0]`来初始化,比如`struct student * del_p = &stu[0];`。
2. `del_q`没有被定义,需要先定义一个新的指针`new_p`,然后使用`new_p`来代替`del_q`,比如`struct student * new_p = &stu[0];`。
3. 在复制数据的过程中,使用指针的方式来进行赋值,同时不能使用`*`号,因为指针已经是地址,`*`号会引用地址对应的值。可以使用`=`号来直接赋值,比如`new_p->id = del_p->id;`。
修改后的`fun4`代码如下:
```c
void fun4(void) {
int del_id, i = 0;
struct student *del_p = &stu[0];
struct student *new_p = &stu[0];
printf("请输入要删除的学生的学号");
scanf("%d", &del_id);
while (i < count) {
if (del_p->id == del_id) {
del_p++;
i++;
}
new_p->id = del_p->id;
strcpy(new_p->name, del_p->name);
strcpy(new_p->gender, del_p->gender);
new_p->score = del_p->score;
i++;
del_p++;
new_p++;
}
count--;
}
```
另外,需要注意的是,删除学生信息时,应该从`count`中减去1,因为我们已经删除了一个学生的信息。
阅读全文