You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在while循环中以矩阵格式打印二维数组

解决二维数组矩阵格式打印时出现随机值的问题

首先咱们来拆解下你遇到的问题根源:当读取过程中遇到-1时,bad会被设为true,内层嵌套循环会立即终止——这时候二维数组ArrB里还有部分元素没被文件中的值赋值,这些未被赋值的元素在内存里是随机的垃圾值,你直接用完整的矩阵打印循环输出整个数组,自然会出现一堆乱码一样的随机数。

另外你原来的代码是边读取边打印单个元素,现在要改成矩阵格式,得调整读取和打印的时机,确保只打印那些已经被成功读取的有效数据,或者在数组完全填满(没有提前遇到-1)的情况下再打印完整矩阵。

下面是修改后的完整代码,我标注了关键修改点:

#include <iostream>
#include <fstream>
#include <string>
#define MAX_ROWS 3
#define MAX_COLUMNS 2
using namespace std;

int main() {
    string fileName = "inFilePgm2A.txt";
    ifstream inFile;
    inFile.open(fileName);
    int checkNbr;
    int ArrB[MAX_ROWS][MAX_COLUMNS];
    bool bad = false;
    bool invalidnum = false;

    while (!inFile.eof()) {
        bad = false;
        invalidnum = false; // 每次循环重置无效数字标记
        // 先尝试完整填充二维数组
        for (int i = 0; (i < MAX_ROWS) && !bad; i++) {
            for (int j = 0; (j < MAX_COLUMNS) && !bad; j++) {
                // 先读取到临时变量,避免把-1存入数组或留下未赋值空位
                int temp;
                inFile >> temp;
                if (temp == -1) {
                    bad = true;
                    cout << "\nThe array does not have enough integers\n";
                } else {
                    ArrB[i][j] = temp;
                    if (ArrB[i][j] < 1) {
                        invalidnum = true;
                    }
                }
            }
        }

        // 仅当数组被完全填满(未提前遇到-1)时,打印矩阵格式
        if (!bad) {
            cout << "\n完整矩阵输出:\n";
            for(int i = 0; i < MAX_ROWS; i++) {
                for(int j = 0; j < MAX_COLUMNS; j++) {
                    cout << ArrB[i][j] << "\t";
                }
                cout << endl;
            }
            // 检查后续数字是否合规
            inFile >> checkNbr;
            if (checkNbr == -1) {
                cout << "The size of the array is correct." << endl;
            } else {
                cout << "\n多余的数字:";
                while (checkNbr != -1) {
                    cout << checkNbr << " ";
                    inFile >> checkNbr;
                }
                cout << "\nYou have too many numbers in this array\n";
            }
        }

        // 输出无效数字提示
        if (invalidnum) {
            cout << "\nThere is/are negative number(s) or zero(s) in the array imported from your text file.\n";
        }
    }
    inFile.close(); // 记得关闭文件流
    return 0;
}

关键修改说明:

  1. 临时变量读取:先把文件内容读到临时变量temp,确认不是-1后再赋值给数组,避免把终止符存入数组,也防止提前终止时留下未赋值的空位。
  2. 打印时机控制:只有当bad为false(数组被完全填满)时,才执行矩阵打印循环,彻底避免输出未赋值的随机值。
  3. 标记位重置:每次进入外层循环时重置invalidnum,避免上一轮的标记影响当前组的判断。
  4. 细节优化:给多余数字的输出加上前缀增强可读性,补充了文件关闭操作(原代码遗漏了这一步)。

当你的输入文件内容是1 2 3 4 5 6 -1 1 2 3 7 5 8 -1 -5 9 4 -1时,程序会先打印第一个完整的3行2列矩阵并提示大小正确;接着处理第二组有效数字,打印矩阵后发现后续还有多余数字并给出提示;最后一组因为未填满数组就遇到-1,只会提示元素不足,不会打印矩阵(避免随机值输出)。

内容的提问来源于stack exchange,提问作者Beans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:39:08