在學習 C 語言時,二維數組的輸入、遍歷以及查找每行最大值是基礎且關鍵的練習。然而,初學者往往會在數組下標的使用、循環變量的作用域以及輸入輸出格式上犯錯。本文通過一個典型的錯誤示例,詳細分析常見問題並給出正確的實現方案。
#define M 3
#define N 5
#include <stdio.h>
void main()
{
int a[M][N];
int i, j, k, t;
for(i=0; i<M; i++){
for(j=0; j<N; j++){
scanf("%d", &a[M][N]); // 錯誤 1
}
}
for(i=0; i<M; i++){
k=1;
for(j=1; j<N; j++){
if(a[i][k] < a[i][j]) k=j;
}
}
for(i=0; i<M; i++){
printf("%d", a[i][k]); // 錯誤 2
printf("\n");
}
}
在第一組雙層循環中,scanf("%d", &a[M][N]) 應為 scanf("%d", &a[i][j])。M 和 N 是宏定義的常量(3 和 5),導致所有輸入都寫入同一個越界位置 a[3][5],不僅無法正確存儲數據,還會造成未定義行為。
k 未在每行重置第二組循環中,k=1 放在行循環內部是正確的,但內層循環從 j=1 開始比較,忽略了第 0 列。且比較條件 a[i][k] < a[i][j] 在 k 初始為 1 時,實際比較的是第 1 列與後續列,導致第 0 列永不參與比較。正確做法是初始化 k=0,內層循環從 j=1 開始。
第三組循環中,printf("%d", a[i][k]) 使用的 k 是上一輪行循環結束後留下的值(即最後一行的最大值列索引),並非當前行 i 的最大值列。應在查找最大值後立即輸出,或將每行的最大值列索引存入另一個數組。
#include <stdio.h>
#define M 3
#define N 5
int main() {
int a[M][N];
int i, j, k;
// 1. 正確輸入
printf("請輸入 %d 行 %d 列的整數:\n", M, N);
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
scanf("%d", &a[i][j]);
}
}
// 2. 查找並輸出每行最大值
for (i = 0; i < M; i++) {
k = 0; // 假設第 0 列最大
for (j = 1; j < N; j++) { // 從第 1 列開始比較
if (a[i][k] < a[i][j]) {
k = j; // 記錄最大值所在列
}
}
printf("第 %d 行最大值:%d (位於第 %d 列)\n", i, a[i][k], k);
}
return 0;
}
掌握這些細節,能幫助你編寫出更健壯、正確的 C 語言程序。