C语言使用指针查找二维矩阵鞍点代码运行异常问题求助
C语言二维矩阵鞍点查找问题修复
问题根因梳理
- 语法错误:代码中
small = *p[I];使用了大写I,C语言大小写敏感,会直接触发编译异常 - 行最小值查找逻辑完全错误:
- 鞍点的定义是行内最小值、列内最大值,代码中判断条件写反,用了
*(p[i] + j) > small,实际是在查找行最大值 - 查找行最小值的过程中完全没有更新
smallcol变量,导致smallcol永远固定为0,定位的行最小值位置完全错误
- 鞍点的定义是行内最小值、列内最大值,代码中判断条件写反,用了
- 冗余输入处理缺失:
scanf默认会跳过所有空白符(包括换行),如果单一行输入的元素数超过列数m,多余值会被当做下一行的元素读取,直接导致矩阵赋值错误 - 输出逻辑异常:未找到鞍点时依然会输出空格,不符合无鞍点输出为空的要求
修复方案
核心修改点
- 修正行最小值查找逻辑,每次更新最小值时同步更新对应的列号
smallcol - 每行读取完m个元素后,清空当前行剩余的输入缓存,忽略冗余值
- 增加鞍点存在标记,无匹配鞍点时不输出任何内容
- 修正大小写笔误,调整多鞍点的输出分隔逻辑
修正后完整代码
#include <stdio.h> #include <stdlib.h> int main() { int n, m, i, j; int small, smallcol, large, largerow; int has_saddle = 0; // 标记是否存在鞍点 scanf("%d%d", &n, &m); // 清空读取n、m后当前行的剩余缓存 while(getchar() != '\n'); int a[n][m]; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &a[i][j]); } // 清空当前行末尾的冗余输入 while(getchar() != '\n'); } int* p[n]; for (i = 0; i < n; i++) { p[i] = a[i]; } for (i = 0; i < n; i++) { // 查找当前行的最小值及对应列号 small = *p[i]; smallcol = 0; for (j = 1; j < m; j++) { if (*(p[i] + j) < small) { small = *(p[i] + j); smallcol = j; } } // 查找对应列的最大值及对应行号 large = *(p[0] + smallcol); largerow = 0; for (j = 1; j < n; j++) { if (*(p[j] + smallcol) > large) { large = *(p[j] + smallcol); largerow = j; } } // 匹配鞍点后输出 if (i == largerow) { if(has_saddle) printf(" "); printf("%d", small); has_saddle = 1; } } return 0; }
内容的提问来源于stack exchange,提问作者Steven Yelnats
相关产品推荐
相关产品推荐

