关于gets()后面的代码会被跳过的问题

白中白中白中白 2018-07-11 07:29:03
我写了一个学生管理系统,但是遇到了输入名字后回车,鼠标会转圈然后就跳出按任意键结束,在网上查了用getchar()等等的方法都不行,求大佬帮帮我
源码在下面:
#include<stdio.h>
#include<malloc.h>
struct student
{
char name[100];
int age;
float score;
};


void student_numer(int *p)
{
printf("请输入学生的个数:");
scanf_s("%d", &*p);
return;
}
//输入
void spt(struct student** q)
{
int i;
for (i = 0; i < *q; ++i)
{
printf("请输入第%d个学生信息:\n", i + 1);
printf("姓名:");
gets(q[i]->name);
printf("年龄:");
scanf_s("%d", &q[i]->age);
printf("成绩:");
scanf_s("%f", &q[i]->score);
return;
}
}
//排序
void arr(int *len, struct student **r)
{
int i;
int j;
struct student **t;
for (i = 0; i < *len - 1; ++i)
{
for (j = 0; j < *len - 1 - i; ++j)
{
if (r[j]->score > r[j + 1]->score)
{
t = r[j];
r[j] = r[j + 1];
r[j + 1] = t;
}
}
}
return;
}
//输出
void out(int *len, struct student **pr)
{
int i;
for (i = 0; i < *len; ++i)
{
printf("第%d个学生的信息是:", i + 1);
printf("姓名:%s\n", pr[i]->name);
printf("年龄:%d\n", pr[i]->age);
printf("分数:%.2f\n", pr[i]->score);
}
}

int main(void)
{
int len = 0;
struct student *pArr;
pArr = (struct student*)malloc(len * sizeof(struct student));

student_numer(&len);//调用函数输入学生的个数
spt(pArr);//调用函数输入学生信息
arr(&len, pArr);//给学生的成绩排序
out(&len, pArr);//调用函数输出学生信息
return 0;
}
...全文
285 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-07-12
  • 打赏
  • 举报
回复
void spt(struct student** q)
{
int i;
for (i = 0; i < *q; ++i)
{
printf("请输入第%d个学生信息:\n", i + 1);
printf("姓名:");
gets(q[i]->name);
printf("年龄:");
scanf_s("%d", &q[i]->age);
printf("成绩:");
scanf_s("%f", &q[i]->score);
return;
}
}

这个逻辑不会发现有问题吗?*q是循环变量的最大值,怎么循环体内还对q[i]->name等呢?
自信男孩 2018-07-12
  • 打赏
  • 举报
回复
scanf_s("%d", &*p);

这个有问题的(*p是取p指向的内存单元的值,&是取地址,取地址一般是对变量的,&*p是对常量取地址,并且这个地址也是不可读写的值)。为什么绕个弯呢,直接一下就好了

scanf_s("%d", p);
老马何以识途 2018-07-12
  • 打赏
  • 举报
回复
给结构体指针分配地址时,len还没有得到输入,它的值是0,因此此处没有分配到内存,接下来的操作就出现非法内存访问了。 第二个问题,函数spt中的循环终止条件是*q,这是地址而不是数组长度,应该跟arr函数一样传入一个学生个数的参数。 另外,传入学生个数不必传地址。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧