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

C语言使用指针查找二维矩阵鞍点代码运行异常问题求助

C语言二维矩阵鞍点查找问题修复

问题根因梳理

  • 语法错误:代码中small = *p[I];使用了大写I,C语言大小写敏感,会直接触发编译异常
  • 行最小值查找逻辑完全错误:
    1. 鞍点的定义是行内最小值、列内最大值,代码中判断条件写反,用了*(p[i] + j) > small,实际是在查找行最大值
    2. 查找行最小值的过程中完全没有更新smallcol变量,导致smallcol永远固定为0,定位的行最小值位置完全错误
  • 冗余输入处理缺失:scanf默认会跳过所有空白符(包括换行),如果单一行输入的元素数超过列数m,多余值会被当做下一行的元素读取,直接导致矩阵赋值错误
  • 输出逻辑异常:未找到鞍点时依然会输出空格,不符合无鞍点输出为空的要求

修复方案

核心修改点

  1. 修正行最小值查找逻辑,每次更新最小值时同步更新对应的列号smallcol
  2. 每行读取完m个元素后,清空当前行剩余的输入缓存,忽略冗余值
  3. 增加鞍点存在标记,无匹配鞍点时不输出任何内容
  4. 修正大小写笔误,调整多鞍点的输出分隔逻辑

修正后完整代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:45:01