随风_233 2021-03-14 20:44 采纳率: 100%
浏览 64
已采纳

PAT乙级1015,调试的时候发现在输入后,会在scanf()处卡住,求大神指点

#include<stdio.h>
#include<stdlib.h>
int Comp(const void *p1, const void *p2);

typedef struct{
    int id;//准考证号 
    int de,cai,total;//德分,才分,总分
    int rank;//考生类别
}Student;//试一下这个地方能否直接用数组

int main(){
    Student stu[100000];//最多可能接收100000个考生信息
    int num, low, high;//分别是考生数目,国家线和院线
    int num_pass=0;//过国家线人数
    scanf("%d%d%d", &num, &low, &high);
    for(int i=0; i<num; ){
        scanf("%d %d %d ", &stu[i].id, &stu[i].de, &stu[i].cai);
        stu[i].total=stu[i].de+stu[i].cai;//接收考生信息,计算总分
        //考生分类
        if(stu[i].de>=high&&stu[i].cai>=high)//德分、才分皆过院线
            stu[i].rank=1;
        else if(stu[i].de>=high&&stu[i].cai>=low&&stu[i].cai<high)//德分过院线,但才分没过院线
            stu[i].rank=2;
        else if(stu[i].de>=low&&stu[i].de<high&&stu[i].cai>=low&&stu[i].cai<high&&stu[i].de>=stu[i].cai)
            stu[i].rank=3;//德分都没过院线,但德分大于等于才分
        else if(stu[i].de>=low&&stu[i].cai>high)//德分没过院线,且才分大于德分 
        	stu[i].rank=4;
        else if(stu[i].de>=low&&stu[i].de<high&&stu[i].cai>=low&&stu[i].cai<high)
            stu[i].rank=5;//德才都没过院线,且德分小于才分
        if(stu[i].de>=low&&stu[i].cai>=low)
            num_pass++;
        i++; 
    }
    //对考生排序
    qsort(stu, num, sizeof(int), Comp);
    printf("%d\n", num_pass);
    for(int i=0; i<num_pass; i++){
        printf("%d %d %d\n", stu[i].id, stu[i].de, stu[i].cai);
    }
    return 0;
}

int Comp(const void *p1, const void *p2){
    Student *a=(Student*)p1;
	Student *b=(Student*)p2;
    if(a->rank!=b->rank)
        return a->rank - b->rank;//如果a的rank小于b,则应该a排在前面
    else if(a->total!=b->total)
        return b->total - a->total;//如果a的总分小于b,则a应该排在后面
    else if(a->de!=b->de)
        return b->de - a->de;//如果a的德分小于b,则a应该排在后面
    else if(a->id!=b->id)
        return a->id - b->id;//如果a的准考证号小于b,应该a排在前面
}

编译通过

调试的时候,会在最后一个测试数据输入完后卡住,可以再输入数据,但程序随后会在scanf()处卡住

 此时调试的时候再点下一步就动不了

另外pat那边oj的结果

输入样例:

14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60

自己的输出结果: 

 

  • 写回答

2条回答 默认 最新

  • 小白小白你好菜 2021-03-14 23:34
    关注

    第17行第3个%d后面的空格去掉,scanf()函数格式输入中最后一个不要是空格,读不到。要在两个数据中间才能读取到空格

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 matlab计算中误差
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊