为什么这个程序的结果总是零?

Sam*_*Sam 2 c

我正在尝试编写一个简单的程序,该程序接收最多 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)

Ast*_*ngs 5

格式说明符%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)

...这清楚地表明解析是问题所在。