如何用C语言获取用户输入填充矩阵?遇段错误求修复
修复段错误及输入逻辑问题
你的代码出现段错误主要是输入处理逻辑混乱导致的,以下是具体问题和修复方案:
核心问题分析
- 非法的
scanf调用:scanf("%c", temp);是严重错误,%c格式需要传入单个char的地址,但你直接传入数组名temp,这不仅逻辑上多余,还可能导致内存写入越界,触发段错误。 - 冗余的
getchar():开头的getchar()会吃掉用户输入的第一个字符,导致scanf读取行列数时得到错误的值,进而创建大小非法的变长数组(比如i为随机大值),造成栈溢出。 - 输入缓冲区处理错误:循环内的
getchar()会意外吃掉用户输入的字符,配合fgets的参数设置不当,导致读取的内容不符合预期,甚至越界。
修复后的代码
#include <stdio.h> #include <string.h> int main(void) { int rows, cols; // 读取矩阵行列数,确保输入有效 if (scanf("%d %d", &rows, &cols) != 2 || rows <= 0 || cols <= 0) { printf("输入无效,请输入正整数的行列数\n"); return 1; } // 跳过scanf留下的换行符 while (getchar() != '\n'); char matrix[rows][cols]; for (int a = 0; a < rows; a++) { // 临时缓冲区要多留一个位置存字符串结束符 char temp[cols + 1]; memset(temp, 0, sizeof(temp)); // 读取一行输入 if (fgets(temp, sizeof(temp), stdin) == NULL) { printf("读取输入失败\n"); return 1; } // 去掉换行符(如果存在) temp[strcspn(temp, "\n")] = '\0'; // 将读取的字符填充到矩阵,确保不超过列数 for (int b = 0; b < cols; b++) { // 如果输入的字符不足,用空格填充(可选,根据需求调整) matrix[a][b] = temp[b] ? temp[b] : ' '; } } // 测试:打印矩阵 printf("输入的矩阵:\n"); for (int a = 0; a < rows; a++) { for (int b = 0; b < cols; b++) { printf("%c ", matrix[a][b]); } printf("\n"); } return 0; }
关键修改点说明
- 移除冗余
getchar():开头的getchar()会破坏行列数的读取,直接删除。 - 添加输入有效性检查:确保行列数是正整数,避免创建非法大小的数组。
- 修正临时缓冲区大小:
temp设为cols+1,给fgets的字符串结束符留足空间,避免越界。 - 处理换行符:用
strcspn去掉fgets读取到的换行符,避免矩阵中包含不必要的换行字符。 - 删除错误的
scanf调用:彻底移除scanf("%c", temp);,这行代码完全不符合逻辑且会导致内存问题。 - 跳过换行符的正确方式:在读取行列数后,用
while (getchar() != '\n');清空输入缓冲区的剩余内容,避免影响后续fgets的读取。
内容的提问来源于stack exchange,提问作者li_a
相关产品推荐
相关产品推荐

