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

C++使用scanf读取二维数组无输出无报错是否为死循环问题咨询

C++代码使用scanf读取二维数组无输出问题分析

核心问题分析

  • scanf返回值判断逻辑错误(无输出的直接原因)
    scanf("%d", &var)的返回值为成功匹配读取的参数个数,只要输入是合法整数就会返回1,只有遇到输入结束(EOF)或格式不匹配时才会返回0或EOF。你写的while (scanf("%d", &arr2d[i][j]))会一次性把所有测试输入的9个整数全部读完,第一次执行就会把j累加到9,直接超出数组的列边界,触发数组越界的未定义行为,后续循环根本没有剩余输入可以读取,自然不会有后续输出。
  • 循环逻辑完全错乱
    你外层用while(t--)会不断修改t的初始值,原本输入t=3要读取3行3列的数组,外层第一次循环t就变成2,for循环的上限i <= t也会跟着变化,根本无法完整遍历3行数组。同时j变量只在初始化时赋值为0,后续永远不会重置,每次读取都会持续累加,必然越界。
  • 使用非标准C++特性
    int arr2d[t][t]属于C99的变长数组(VLA)特性,C++标准从未支持该写法,仅部分编译器做了扩展兼容,实际生产环境不建议使用,会有兼容性风险。

修正后代码示例

保留scanf写法的版本

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int t;
    cin >> t;
    // 用动态申请替代非标准变长数组
    int** arr2d = new int*[t];
    for(int k = 0; k < t; k++) {
        arr2d[k] = new int[t];
    }
    // 按行列规则读取数组
    for(int i = 0; i < t; i++) {
        for(int j = 0; j < t; j++) {
            scanf("%d", &arr2d[i][j]);
            cout << arr2d[i][j] << " ";
        }
        cout << endl;
    }
    // 释放申请的内存
    for(int k = 0; k < t; k++) {
        delete[] arr2d[k];
    }
    delete[] arr2d;
    return 0;
}

更符合C++规范的vector+cin版本

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int t;
    cin >> t;
    vector<vector<int>> arr2d(t, vector<int>(t));
    for(int i = 0; i < t; i++) {
        for(int j = 0; j < t; j++) {
            cin >> arr2d[i][j];
            cout << arr2d[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:54:07