C语言中忽略转义序列:读取N×N整数矩阵并合并为单字符串
问题描述
需要读取一个N×N的整数矩阵,将其以字符序列形式存入字符数组处理。要求矩阵一次性从标准输入传入(比如从TXT文件复制内容),忽略转义字符(如\n),将所有N×N整数合并为单个以空格分隔的字符串,输入以回车键结束。
尝试使用gets函数时,遇到\n就停止读取,无法获取完整矩阵;改用fgets实现的代码也未达到预期效果。相关示例如下:
目标效果示例
char buff[512]; gets(buff); /*输入矩阵 1 2 9 10 25 4 3 8 11 24 5 6 7 12 23 16 15 13 14 22 17 18 19 20 21*/ printf("%s", buff); /*预期输出与输入矩阵一致,合并为无换行的空格分隔字符串*/
初始代码及问题
int main(){ int size; printf("enter size of matrix >> "); scanf("%d",&size); int matrix[size][size]; char allNumbers[size][512]; for (int i = 0; i < size; i++){ fgets(allNumbers[i], 511, stdin); } printf("%s", allNumbers[2]); return 0; }
输入内容(含转义符示意):1 2 9 10 25\n 4 3 8 11 24\n 5 6 7 12 23\n 16 15 13 14 22\n 17 18 19 20 21\0
实际输出仅为第一行内容:1 2 9 10 25,无法合并所有行。
问题原因分析
- 输入缓冲区残留问题:
scanf("%d", &size)读取矩阵大小后,输入缓冲区中会留下换行符,第一个fgets会直接读取这个换行符,导致allNumbers[0]为空字符串,后续读取的行整体错位。 - 未处理换行符合并:
fgets按行读取内容,本身会保留换行符,且初始代码没有将多行内容合并为单个字符串,自然无法得到预期的无换行结果。
解决方案代码
#include <stdio.h> #include <string.h> int main() { int size; printf("输入矩阵大小 >> "); // 读取矩阵大小并清除缓冲区残留的换行符 scanf("%d", &size); getchar(); // 定义足够大的缓冲区存储合并后的字符串 char merged_str[1024] = {0}; char line_buf[512]; // 循环读取每一行输入,直到遇到空行(用户回车结束输入) while (fgets(line_buf, sizeof(line_buf), stdin) != NULL) { // 移除行尾的换行符 line_buf[strcspn(line_buf, "\n")] = '\0'; // 空行表示输入结束,退出循环 if (strlen(line_buf) == 0) { break; } // 将当前行内容追加到合并缓冲区 strcat(merged_str, line_buf); strcat(merged_str, " "); } // 移除最后多余的空格 if (strlen(merged_str) > 0) { merged_str[strlen(merged_str) - 1] = '\0'; } printf("合并后的结果:\n%s\n", merged_str); return 0; }
代码说明
- 处理缓冲区残留:用
getchar()清除scanf留下的换行符,确保后续fgets能正确读取矩阵内容。 - 逐行读取并合并:循环读取每一行,先移除行尾的换行符,再将行内容追加到合并缓冲区,同时用空格分隔。
- 终止条件:当读取到空行时,判定输入结束,停止读取。
- 清理多余空格:最后移除合并字符串末尾多余的空格,保证输出格式整洁。
内容的提问来源于stack exchange,提问作者cucurbita
相关产品推荐
相关产品推荐

