程序崩溃?

时间:2017-01-24 19:33:14

标签: c string for-loop crash

我是编程新手,我把这作为一种爱好。所以我开始解决练习,但我的程序意外崩溃 这是练习:

  

敏感社会俱乐部组织捐赠活动。为了在活动中增加乐趣,他们组织了各部门之间的竞争。在竞赛中,顶级捐赠学生和部门将获得证书。

     

问题:编写一个程序,读取n个学生的信息,然后显示捐赠金额最多的学生的名称和平均值最高的部门。

     

输入规范:您将在开头给出一个整数(n)。然后,以下n行将有三个信息:

     

学生姓名:姓名最多20个字符串,其中只包含26个英文(大写或小写)字母:最多4个字符长字符串(竞赛中只有3个部门:CEN ,ECE或BINF)

     

输出规格:显示两个字符串:
  捐赠最多的学生的姓名,
  平均水平最高的部门。

int n,i,CENc=0,ECEc=0,BINFc=0,CENa=0,ECEa=0,BINFa=0,amountS,amountH=0,avgCEN,avgECE,avgBINF;
char department[4],name[20],nameH[20];
scanf ("%d",&n);
for (i=0;i<n;i++);{
    gets (name);
    gets (department);
    scanf("%d",&amountS);
    if (strcmp(department,"ECE")==0){
        ECEa=ECEa+amountS;
        ECEc++;
    }
     else if (strcmp(department,"CEN")==0){
        CENa=CENa+amountS;
        CENc++;
    }
     else if (strcmp(department,"BINF")==0){
        BINFa=BINFa+amountS;
        BINFc++;
    }
     if (amountS>amountH){
            amountH=amountS;
            strcpy(nameH,name);
     }

}
avgCEN=CENa/CENc;
avgECE=ECEa/ECEc;
avgBINF=BINFa/BINFc;
 if (avgCEN>avgECE && avgCEN>avgBINF){
    printf("%d", avgCEN);
    printf("%s", nameH);
 }
 else if (avgECE>avgCEN && avgECE>avgBINF){
    printf("%d", avgECE);
    printf("%s", nameH);
 }
 else if (avgBINF>avgCEN && avgBINF>avgECE){
    printf("%d", avgBINF);
    printf("%s", nameH);
 }
  return 0

所以我知道它做得有点糟糕,但这就是问题所在 我输入了第一和第二行输入Johnny CEN 500 Mark BINF 600,之后程序崩溃了 对于为什么会发生这种情况有什注意:我不想在这个时候使用数组,因为我正在学习基础知识并继续花时间去处理更复杂的东西。

1 个答案:

答案 0 :(得分:0)

您输入第二个输入Mark BINF 600,现在部门只有4个字符,包括空字符\0。因此,请将char department[4]更改为char department[5]

同样来自What does gets() save when it reads just a newline关于gets()的工作的答案。

gets说明中的这一部分可能令人困惑:

  

所有角色都需要(但不包括)换行符

     
    

最好说 所有字符包括换行符,但存储所有字符不包括新线。

         

因此,如果用户输入some stringgets函数将从用户终端读取some string和换行符,但仅在缓冲区中存储some string - 换行符丢失了。这很好,因为无论如何都没有人想要换行符 - 它是一个控制字符,而不是用户想要输入的数据的一部分。

         

因此,如果您只按输入gets会将其解释为空字符串。

  

然后在你的第scanf ("%d",&n)行开始,当你输入输入并按回车键时,新行字符存储在缓冲区中,所以当执行到达gets (name)时,{{1读取新行字符并将字符串解释为空并向前移动,以便消化新行字符,你可以做到这一点,

gets

因此,缓冲区中存在的新行字符将存储在a中, char a ; scanf("%d" , &n); scanf("%c" , &a); 将不会读取。

此外,如果您在gets之类的行上提供输入,那么Johnny CEN 500可能会将所有内容存储在一个字符串中,因为它会计算空白区域。所以你可能不希望这样。

在这部分代码的某处你可能正在划分gets()

0