如何在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
相关产品推荐
相关产品推荐

