为什么void delet() { printf("\n请输入学生的学号:"); int p,o; char m; scanf("%d",&o); for(p=0;p<STUDENT_NUM;p++) { if(o==student[p].no) { printf("\n学号 姓名 年龄 性别 班级 宿舍 电话号码\n"); printf("%-4d%-4s%-4d%-3s%-4d%-5s%s",student[p].no,student[p].name,student[p].age,student[p].sex,student[p].c1ass,student[p].address,student[p].phone); break; } } printf("\n是否删除\n1.是 2.否\n"); getchar(); scanf("%c",&m); switch(m) { case 1: student[p].no=-1; printf("\n返回菜单\n"); break; case 2: printf("\n返回菜单\n"); break; } }删除没能生效
时间: 2024-03-19 21:44:20 浏览: 105
根据你提供的代码,我发现在选择是之后,虽然执行了 `student[p].no=-1;`,但是只是将学生的学号置为了 -1,而没有真正删除该学生。因此,在查找到学生之后,你需要将该学生从数组中删除。你可以将后面的学生信息向前移动一个位置,以覆盖掉该学生的信息。最后,你需要将最后一个学生的信息清空。修改后的代码如下:
```c
switch(m) {
case 1:
for (int i = p; i < STUDENT_NUM - 1; i++) {
student[i] = student[i+1];
}
student[STUDENT_NUM - 1].no = 0;
printf("\n返回菜单\n");
break;
case 2:
printf("\n返回菜单\n");
break;
}
```
这样就可以保证在选择是之后,真正地删除了该学生信息。
相关问题
为什么void delet() { printf("\n请输入学生的学号:"); int p,o; char m; scanf("%d",&o); for(p=0;p<STUDENT_NUM;p++) { if(o==student[p].no) { printf("\n学号 姓名 年龄 性别 班级 宿舍 电话号码\n"); printf("%-4d%-4s%-4d%-3s%-4d%-5s%s",student[p].no,student[p].name,student[p].age,student[p].sex,student[p].c1ass,student[p].address,student[p].phone); break; } } printf("\n是否删除\n1.是 2.否\n"); getchar(); scanf("%c",&m); switch(m) { case 1: student[p].no=-1; printf("\n返回菜单\n"); case 2: printf("\n返回菜单\n"); } }在选择是之后没有生效
根据你提供的代码,我发现在选择是之后,虽然执行了 `student[p].no=-1;`,但是没有 break 语句跳出循环。因此,程序会继续执行,输出 "返回菜单",这导致程序表现出来好像选择是之后没有生效。你可以在 case 1 的最后添加一个 break 语句,以跳出 switch 语句。修改后的代码如下:
```c
switch(m) {
case 1:
student[p].no=-1;
printf("\n返回菜单\n");
break; // 添加 break 语句
case 2:
printf("\n返回菜单\n");
break;
}
```
这样就可以保证在选择是之后,只输出一次 "返回菜单",并且成功删除了学生信息。
为什么void delet() { printf("\n请输入学生的学号:"); int p,o; char m; scanf("%d",&p); for(p=0;p<STUDENT_NUM;p++) { if(o==student[p].no) { printf("\n学号 姓名 年龄 性别 班级 宿舍 电话号码\n"); printf("%-4d%-4s%-4d%-3s%-4d%-5s%s",student[p].no,student[p].name,student[p].age,student[p].sex,student[p].c1ass,student[p].address,student[p].phone); break; } } printf("\n是否删除\n1.是 2.否\n"); scanf("%c",&m); switch(m) { case 1: student[p].no=-1; printf("\n返回菜单\n"); case 2: printf("\n返回菜单\n"); }在显示是否删除后跳过了之后的内容
这段代码存在一些问题。首先,在输入学生学号后,代码中的循环会将输入的学号覆盖为0,这会导致后面的查找出现问题。其次,在判断学号是否相同时,代码中的o变量没有初始化,也就是说会出现未定义行为。最后,在输入是否删除时,应该使用字符变量而不是整型变量。
关于为什么在显示是否删除后跳过了之后的内容,是因为在输入是否删除时,代码中使用了"%c"格式符读取字符,但是在输入该字符前,输入缓冲区中可能会存在换行符等字符,这些字符会被直接读取到字符变量中,导致后面的内容被跳过。可以在输入字符前使用一个getchar()函数来清空输入缓冲区,或者改用"%d"格式符读取整型变量,然后将输入的整型值转换为字符。
阅读全文