C语言实现用户自定义大小二维数组的镜像性判断
功能实现问题修正方案
原代码核心问题
- 变量语义混淆:将输入的行列数分别存入
col/row后,又把col作为行遍历上限,逻辑完全颠倒 - 硬编码数组大小:固定声明
arr[10][10],无法支持用户输入的任意行列大小 - 校验逻辑缺失:没有做对称位置元素的比对,仅倒序遍历列就直接打印结果,且会重复输出多次
- 无全局校验标记:只要有一处对称位置不匹配就应该输出非镜像,原代码没有对应判断逻辑
修正后实现要点
- 先读取行列数,再通过变长数组(C99及以上支持)动态声明二维数组,适配任意行列大小
- 逐行遍历每行的前半段元素,比对当前元素与该行对称位置(
col-1-j)的元素是否相等 - 只要存在任意一组不匹配的元素,直接标记为非镜像,提前终止遍历
- 仅当所有行的所有对称位置元素都相等时,才输出最终结果
完整可运行代码
#include <stdio.h> int main() { // 先读取行列数(输入第一个为行数row,第二个为列数col,匹配输入格式要求) int row, col; scanf("%d %d", &row, &col); // 动态声明变长数组,支持任意行列大小 int arr[row][col]; // 读取数组元素 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { scanf("%d", &arr[i][j]); } } int is_mirror = 1; // 初始标记为是镜像数组 // 逐行校验对称位置元素,只要标记为非镜像就自动终止外层循环 for (int i = 0; i < row && is_mirror; i++) { // 只需要遍历到列数的一半即可,避免重复比对 for (int j = 0; j < col / 2; j++) { // 比对当前元素与对称位置元素 if (arr[i][j] != arr[i][col - 1 - j]) { is_mirror = 0; break; } } } // 输出最终结果 printf("%s", is_mirror ? "Mirror" : "Not Mirror"); return 0; }
兼容性说明
如果需要兼容不支持变长数组的旧版C标准,可以改用malloc动态分配二维内存,逻辑完全一致:
动态分配示例:先通过
int (*arr)[col] = malloc(sizeof(int[row][col]))申请内存,用完后记得free(arr)释放即可。
测试示例
输入所有行对称位置元素相等的用例:
3 3 1 0 1 2 0 2 4 0 4
输出:Mirror
将第二行修改为2 0 3后,对称位置元素不匹配,输出:Not Mirror
内容的提问来源于stack exchange,提问作者Qwet Ruplet
相关产品推荐
相关产品推荐

