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

如何在C语言中读取含行列、模式数的指定格式矩阵输入

C语言读取矩阵输入解决方案

核心修改点

  • 调整参数读取逻辑:你的示例输入第一行就包含了行数m、列数n、模式数量三个值,我们优先从标准输入流读取这三个参数,不需要依赖命令行传参。如果需要保留命令行传参逻辑,可自行调整判断分支。
  • 处理输入换行符问题:读取完第一行的三个整数后,需要先消费掉缓冲区残留的换行符,避免后续读取字符时误读空行或换行符。
  • 矩阵字符转数字:每行的0/1是字符形式,直接通过c - '0'即可转换为对应整数值存入数组。

完整可运行代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) 
{
    int **array;
    int m, n, pattern_cnt;

    // 读取第一行的三个参数:行数、列数、模式数量
    if (scanf("%d %d %d", &m, &n, &pattern_cnt) != 3) {
        printf("输入格式错误\n");
        return 1;
    }
    // 消费掉第一行末尾的换行符,避免后续读行出错
    getchar();

    // 动态分配二维数组
    array = calloc(m, sizeof(int *));
    if (array == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    for (int i = 0; i < m; i++) {
        array[i] = calloc(n, sizeof(int));
        if (array[i] == NULL) {
            // 分配失败时释放已申请的内存,避免泄漏
            for (int j = 0; j < i; j++) {
                free(array[j]);
            }
            free(array);
            printf("内存分配失败\n");
            return 1;
        }
    }

    // 逐行读取矩阵内容
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            char c = getchar();
            array[i][j] = c - '0';
        }
        // 消费掉当前行末尾的换行符
        getchar();
    }

    // 这里可以加测试代码,验证读取是否正确,比如输出前几行
    /*
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d", array[i][j]);
        }
        printf("\n");
    }
    */

    // 释放内存
    for (int i = 0; i < m; i++) {
        free(array[i]);
    }
    free(array);

    return 0;
}

补充说明

如果你的输入是通过文件重定向传入(比如./program < input.txt),上述代码可以直接正常运行。如果需要保留原来从命令行参数读取m和n的逻辑,只需要把读取m、n的部分替换为原来的atoi(argv[1])逻辑,额外加一行代码读取第一行剩下的模式数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:15:11