首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 二維陣列輸入輸出錯誤修正:索引越界與迴圈邊界完整解析

     編輯:程式設計疑難解答

原始錯誤代碼

int stu[10][4];
for (i = 1; i <= 10; i++) {
    for (j = 1; j <= 4; j++) {
        cin >> stu[10][4]; // 錯誤:固定寫入 stu[10][4] 越界
    }
}
for (i = 1; i <= 10; i++) {
    for (j = 1; j <= 4; j++) {
        cout << stu[i][j] << endl; // 索引 1~10 越界,合法 0~9
    }
}

三大錯誤

  1. 陣列索引從 0 開始:stu[10][4] 合法索引為 0~9、0~3。
  2. 輸入語句寫死索引:應為 cin >> stu[i][j]。
  3. 輸出格式:每行 4 科成績應同行顯示,而非每科換行。

修正後標準寫法

#include <iostream>
using namespace std;

int main() {
    const int STUDENTS = 10;
    const int SUBJECTS = 4;
    int stu[STUDENTS][SUBJECTS];

    for (int i = 0; i < STUDENTS; i++) {
        cout << "請輸入第 " << i+1 << " 位學生的四門成績: ";
        for (int j = 0; j < SUBJECTS; j++) {
            cin >> stu[i][j];
        }
    }

    cout << "\n所有學生成績:\n";
    for (int i = 0; i < STUDENTS; i++) {
        for (int j = 0; j < SUBJECTS; j++) {
            cout << stu[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

進階:動態分配與 vector

vector<vector<int>> stu(STUDENTS, vector<int>(SUBJECTS));
// 使用方式相同,自動管理記憶體,支援擴容

除錯技巧

  • 編譯加 -Wall -Wextra -fsanitize=address(GCC/Clang)啟用位址消毒器捕獲越界。
  • Visual Studio 開啟 /RTC1 執行期檢查。
  • 善用 assert(i >= 0 && i < STUDENTS) 防禦性編程。

修正後輸出截圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved