我正在尝试编写一个简单的程序,该程序接收最多 30 个学生的分数、姓名和 ID,并打印他们的平均分数。我想知道为什么程序的结果总是零。
如果有人能给我一个提示,我很感激。
这是代码:
#include <stdio.h>
struct student{
char name[30];
int mark;
int ID;
} s[30];
int main() {
int n, i=0, sum=0;
float average;
/* printf("enter the number of students: "); */
scanf("%d", &n);
/* printf("enter their information: "); */
for(i=0; i<n; i++)
scanf("%s,%d,%d",s[i].name,&s[i].mark,&s[i].ID);
for(i=0; i<n; i++)
sum+=s[i].mark;
average=sum/(float)n ;
printf("%.2f", average);
}
Run Code Online (Sandbox Code Playgroud)
格式说明符%s说要读取一个字符串,它正在这样做……包括您的逗号和后续字符。这是“贪婪”。
然后就没有什么东西%d可以吸收了,所以所有的整数都保持为零。
我建议你一次读一行,然后解析这些行。
或者,对这个类似的问题有一些建议。
当遇到这样的问题时,您应该尝试通过检查调试器中变量的值来缩小问题的范围,或者甚至只是使用printf,如下所示:
printf("%s|%d|%d\n", s[i].name, s[i].mark, s[i].ID);
Run Code Online (Sandbox Code Playgroud)
当我把它放在你的第一个循环中,并将以下输入传递给程序时:
printf("%s|%d|%d\n", s[i].name, s[i].mark, s[i].ID);
Run Code Online (Sandbox Code Playgroud)
...输出是这样的:
2
A,2,3
B,4,5
Run Code Online (Sandbox Code Playgroud)
...这清楚地表明解析是问题所在。