C++二维char数组转一维方法及矩阵左右对角线元素相等判断
问题原因解析
- 最初check函数报错的原因:你的判断完全正确,最初版本里
left、right被定义为二维数组,left[dimL++]指向的是二维数组的一整行,属于不可修改的数组首地址,你将单个char类型的矩阵元素赋值给它,自然触发“需要可修改左值”的报错,将两个对角线存储数组改为一维的解决方案是完全可行的。 - 主函数无法访问
left/right的原因:这两个数组是check函数内部的局部变量,作用域仅局限在check函数内部,函数执行结束后对应内存就会被系统回收,主函数根本无法识别这两个变量,强行调用必然报错。另外你写的打印代码本身有语法错误,错把循环关键字for写成了if。 - 额外隐患:你最初主函数里重复调用了两次
check函数,会重复执行对角线提取、比对逻辑,造成不必要的性能浪费;同时主函数里用局部变量n定义变长数组char a[n][n]不属于标准C++支持的语法,属于编译器扩展特性,兼容性较差。
完整修复方案
将left、right数组改为在主函数中定义,通过参数传入check函数,即可在主函数中直接访问两个对角线的内容,同时统一用固定最大尺寸常量定义数组,兼容性更强:
#include <iostream> using namespace std; const int MAX_SIZE = 100; // 统一矩阵最大尺寸 bool check(char a[MAX_SIZE][MAX_SIZE], int n, char left[], char right[], int &dimL, int &dimR ){ dimL = 0; // 调用前重置计数,避免多次调用时计数错误 dimR = 0; for( int i = 0; i < n; i++ ){ for( int j = 0; j < n; j++ ){ if( i == j ){ left[dimL++] = a[i][j]; } if( i + j == n - 1 ){ right[dimR++] = a[i][j]; } } } for( int i = 0; i < n; i++ ){ if( left[i] != right[i] ) return false; } return true; } int main(){ int n; char a[MAX_SIZE][MAX_SIZE]; char left[MAX_SIZE], right[MAX_SIZE]; // 主函数内定义对角线存储数组 int dimL = 0; int dimR = 0; cout << "Input the dimension of the matrix: "; cin >> n; for( int i = 0; i < n; i++ ) for( int j = 0; j < n; j++ ){ cin >> a[i][j]; } cout << "Matrix A is: " << endl; for( int i = 0; i < n; i++ ){ for( int j = 0; j < n; j++ ){ cout << a[i][j] << " "; } cout << endl; } bool res = check(a,n,left,right,dimL,dimR); // 打印两个对角线元素 cout << "Left diagonal elements: "; for(int i = 0; i < dimL; i++ ){ cout << left[i] << " "; } cout << endl << "Right diagonal elements: "; for(int i = 0; i < dimR; i++ ){ cout << right[i] << " "; } cout << endl; if(res){ cout << "YES"; } else { cout << "NO"; } return 0; }
内容的提问来源于stack exchange,提问作者aprilio
相关产品推荐
相关产品推荐

