錯誤代碼
scanf("%d", &stu[i].num);
gets(stu[i].name); // ❌ 讀取上一行殘留的 \n
scanf("%.2f", &stu[i].score); // ❌ 格式錯誤,%f 不接受精度
三大問題
scanf("%d") 留下 \n,gets 讀到空行。
gets 已棄用(緩衝區溢出風險),應用 fgets。
scanf("%.2f") 非法,浮點輸入用 %f 或 %lf。
修正版
scanf("%d", &stu[i].num);
getchar(); // 吞掉 \n
fgets(stu[i].name, sizeof(stu[i].name), stdin);
stu[i].name[strcspn(stu[i].name, "\n")] = '\0'; // 去尾部 \n
scanf("%f", &stu[i].score);
getchar(); // 吞掉 \n
最佳實踐:整行讀取 + sscanf
char line[256];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d %s %f", &stu[i].num, stu[i].name, &stu[i].score);
// 注意:%s 遇空格截斷,姓名含空格需用分隔符或 fgets 解析