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++; } *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++; } printf("未找到所输入id的学生信息\n"); }为什么不能用struct student类型的指针指向 stuN]
时间: 2024-03-04 14:50:56 浏览: 28
这段代码中的问题很多,其中一个问题是 `struct student * del_p = stu[N];` 这一句。这里使用了 `stu[N]`,但是它没有被定义,所以无法确定它的类型和值。如果 `stu[N]` 是一个数组,那么需要指定它的类型和大小,比如 `struct student stu[100];`。另外,如果 `stu[N]` 是一个指针,那么需要给它赋值,让它指向一个有效的内存地址。
另外,在这段代码中,指针 `del_p` 和 `del_q` 没有被初始化,就被用来进行赋值操作,这是不安全的。正确的做法应该是先为它们分配内存,比如使用 `malloc` 函数。
最后,这段代码中的循环体内部没有判断是否找到了要删除的学生信息,如果没有找到,就应该输出提示信息。
相关问题
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有问题
根据你提供的代码,可以看出`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,因为我们已经删除了一个学生的信息。
#include<stdio.h> #define MAXN 100 struct student{ char name[20]; int score; }; void cnt_score( struct student *p, int n ); int main() { int i, n; struct student stu[MAXN]; scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%s%d", stu[i].name, &stu[i].score); } cnt_score(stu, n); return 0; } void cnt_score(struct student *p, int n) { int cnt_a = 0, cnt_p = 0, cnt_f = 0; struct student stu[q];struct student *p=stu while ( p <= q ){ if ( (*p).score>=80&&(*p).score<=100 ) cnt_a++; else if ( (*p).score>=60&&(*p).score<=79 ) cnt_p++; else cnt_f++; p++; } printf("%d %d %d\n", cnt_a, cnt_p, cnt_f); }
这段代码存在以下问题:
1. 在 `cnt_score()` 函数中,定义了一个 `struct student` 类型的指针 `p`,但并没有给它赋值,也没有使用传入的指针参数 `p`,因此会导致编译时出现错误。
2. 在 `cnt_score()` 函数中,定义了一个 `struct student` 类型的数组 `stu`,但是并没有使用,也没有给它赋值,同样会导致编译时出现错误。
3. 在 `cnt_score()` 函数中,没有使用传入的指针参数 `p` 来统计成绩的数量,而是使用了未定义的变量 `q`,这也会导致编译时出现错误。
下面是修改后的代码:
```c
#include<stdio.h>
#define MAXN 100
struct student{
char name[20];
int score;
};
void cnt_score(struct student *p, int n);
int main() {
int i, n;
struct student stu[MAXN];
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%s%d", stu[i].name, &stu[i].score);
}
cnt_score(stu, n);
return 0;
}
void cnt_score(struct student *p, int n) {
int cnt_a = 0, cnt_p = 0, cnt_f = 0;
while (p < p + n) { // 使用传入的指针参数 p 来统计成绩的数量
if ((*p).score >= 80 && (*p).score <= 100)
cnt_a++;
else if ((*p).score >= 60 && (*p).score <= 79)
cnt_p++;
else
cnt_f++;
p++;
}
printf("%d %d %d\n", cnt_a, cnt_p, cnt_f);
}
```
修改后的代码中,使用传入的指针参数 `p` 来统计成绩的数量,同时删除了无用的变量和语句。