结构体加指针输出成绩最高的学生姓名学号,包括错误认识

题目:

输入多个学生的学号、姓名和成绩,然后输出成绩最高的哪个学生的姓名和学号

输入描述:

输入包含多组样例。

每组样例包含一个整数N,代表有N个学生。

接下来N行依次输入每个学生的学号、姓名和成绩。
若N = 0,则表示输入结束,这个样例不需要被处理。

输出描述:

对于每组用例,你应当输出这组样例N个学生中成绩最高的学生的姓名和学号,每个输出占一行。

样例输入:

2
1000 mingming 89
1001 lingling 90
3
1090 huanghuang 88
1076 zhouzhou 76
1003 xiaohong 87

样例输出:

1001 lingling
1090 huanghuang

代码实现:(编译环境:CLion)

#include<stdio.h>
#include<stdlib.h>
struct student{
    int No;
    char name[100][100];
    int score;
}t[100];
void line(int *N)
{
    int j,max=0,n=0;
    for(j=0;j<(*N);j++) {
        scanf("%d", &t[j].No);
        scanf("%s", t[j].name[j]);
        scanf("%d", &t[j].score);
    }
        for (j = 0; j < (*N); j++) {
if(t[j].score>=max)
{
    n=j;
    max=t[j].score;
}
        }
        printf("%d %s",t[n].No,t[n].name[n]);
        printf("\n");
}
int main()
{
    int i;
    int *N;
    N=malloc(100*sizeof(int));
    for(i=0;;i++)
    {
        scanf("%d",N);
        if((*N)==0)
        {
            printf("\n");
            break;
        }
        line(N);
        N++;
    }
    return 0;
}

注意:在开始写这个代码时没有用到malloc或者calloc函数,但运行过程中出了问题,编译器给出信号“Segmentation fault”,可能原因是程序包含了非法的内存访问,数组越界,指针漂移,调用系统禁用的系统函数等,数组空间足够应该不存在数组越界问题,所以我认为问题出在指针,因此直接利用calloc给N分配内存空间,但是情况并没有改变。于是我尝试将代码复制到Dev C++上运行,系统报错“[Warning] array 't' assumed to have one element”,说明问题出在开始的结构体数组t[]上,定义一个大小,t[100],问题得以解决。在CLion上不会报错,系统允许运行,但是仍然不会完美运行,比如程序在输入0后仍然不会立马结束,而Dev C++则直接不允许运行。这个错误源于我的大意,对于结构体数组的初始化很简单,与数组的初始化类似,也可以不指定结构体数组t的元素个数,但要直接给数组赋值而不能像我开始一样定义了却还没赋值,例如:

struct teacher
{
long num;
cahr name[20];
int age;
char sex;
char depart[30];
}t[]={{2018001,"zhang san",35,'M',"computer Department"},
      {2018002,"Li Si",45,'M',"computer Department"},
      {2018003,"Wang Ling",30,'F',"computer Department"}};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值