改进代码 scanf_s("%d %s %f %f %f", &stu[i].id, stu[i].name,&stu[i].daily_score, &stu[i].practice_score, &stu[i].final_score); // 计算总评成绩 stu[i].total_score = stu[i].daily_score * 0.3 + stu[i].practice_score * 0.3 + stu[i].final_score * 0.4;
时间: 2023-12-10 20:41:13 浏览: 93
可以考虑使用 fgets() 函数来读取字符串,这样可以避免使用 scanf() 函数时可能出现的缓冲区溢出问题。同时,为了确保读取的数据类型正确,可以在读取前先清空输入缓冲区。
改进后的代码如下:
```
#include <stdio.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
struct Student {
int id;
char name[20];
float daily_score;
float practice_score;
float final_score;
float total_score;
};
int main()
{
struct Student stu[MAX_STUDENT_NUM];
int n, i;
printf("Please enter the number of students: ");
scanf("%d", &n);
// 清空输入缓冲区
while (getchar() != '\n');
for (i = 0; i < n; i++) {
printf("Please enter the ID, name, daily score, practice score and final score of student %d: ", i + 1);
// 读取字符串
fgets(stu[i].name, 20, stdin);
// 去掉字符串末尾的换行符
stu[i].name[strcspn(stu[i].name, "\n")] = '\0';
// 读取其他数据类型
scanf("%d %f %f %f", &stu[i].id, &stu[i].daily_score, &stu[i].practice_score, &stu[i].final_score);
// 计算总评成绩
stu[i].total_score = stu[i].daily_score * 0.3 + stu[i].practice_score * 0.3 + stu[i].final_score * 0.4;
}
// 输出学生信息
printf("\n");
printf("ID\tName\t\tDaily score\tPractice score\tFinal score\tTotal score\n");
for (i = 0; i < n; i++) {
printf("%d\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[i].id, stu[i].name, stu[i].daily_score, stu[i].practice_score, stu[i].final_score, stu[i].total_score);
}
return 0;
}
```
这段代码可以正确读取字符串和其他数据类型,并计算每位学生的总评成绩。同时,输出格式也进行了一定的调整,使得输出更加清晰易读。
阅读全文