我是编程新手,我把这作为一种爱好。所以我开始解决练习,但我的程序意外崩溃 这是练习:
敏感社会俱乐部组织捐赠活动。为了在活动中增加乐趣,他们组织了各部门之间的竞争。在竞赛中,顶级捐赠学生和部门将获得证书。
问题:编写一个程序,读取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
,之后程序崩溃了
对于为什么会发生这种情况有什注意:我不想在这个时候使用数组,因为我正在学习基础知识并继续花时间去处理更复杂的东西。
答案 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 string
,gets
函数将从用户终端读取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