代碼中 for(i=0; i<N; i++) 正確,但輸出第一組數據變 0。實際問題往往在於:
scanf("%f%d", &M, &N); // 讀完 N 後,緩衝區留下 '\n'
for(i=0;i
scanf("%f%d", &M, &N);
getchar(); // 吸收殘留換行符
// 或用 " %f" 格式串(前面有空格)自動跳過空白字符
代碼中 paixu 函數交換邏輯有誤:
if (i != k) {
t_1 = food[i][1]; t_2 = food[i][0];
food[i][1] = food[j][1]; // 錯:j 迴圈結束後是 N,越界!
food[i][0] = food[j][0];
food[j][1] = t_1; food[j][0] = t_2;
}
if (i != k) {
t_1 = food[i][1]; t_2 = food[i][0];
food[i][1] = food[k][1];
food[i][0] = food[k][0];
food[k][1] = t_1; food[k][0] = t_2;
}
while (scanf("%f%d", &M, &N) && M != -1 && N != -1) {
float food[100][2] = {0}; // 每次循環重新定義數組,上輪數據丟失
// ...
}
若需多組測試,數組應定義在循環外,或動態分配。
scanf 後檢查返回值(成功讀取的項數)i,j 及讀入值確認
3. 用 fgets + sscanf 替代 scanf 更健壯
4. 開啟編譯器警告 -Wall -Wextra
核心提示:C 數組下標從 0 開始,但這不會導致「第一組變 0」;真兇通常是輸入緩衝區殘留字符或排序邏輯越界。