使用scanf读取字符矩阵时输出异常的问题求助
字符矩阵输入读取问题解决
输入格式要求
需要接收如下格式的字符矩阵输入:
6 5 *###** ##***# ##*### ##*### #**###
现有代码
当前使用的代码如下:
#include <stdio.h> int main() { int n, m; scanf("%d %d\n", &n, &m); char list[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%c", &list[i][j]); } } for(int i=0;i<n;i++) { for(int j =0;j<m;j++) { printf("%c",list[i][j]); } } return 0; }
问题现象
运行后输出不符合预期,实际输出如下:
*###** ##***# ##*### ##*### #*
确实如你猜测,问题出在换行符被当作有效字符读进了数组,导致后续的字符读取位置错位,最后一行输出不完整。
解决方法
这里提供两种可靠的修改方案:
方案1:手动吃掉换行符
修改点:
- 去掉
scanf("%d %d\n", &n, &m);里的\n,改成scanf("%d %d", &n, &m);——格式串里的\n会匹配任意空白,反而容易导致输入处理异常。 - 读取完n和m后,用
getchar()吃掉输入流中剩余的换行符。 - 每读完一行的m个字符后,再用
getchar()吃掉该行末尾的换行符。
修改后的代码:
#include <stdio.h> int main() { int n, m; scanf("%d %d", &n, &m); getchar(); // 吃掉n和m后的换行符 char list[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%c", &list[i][j]); } getchar(); // 吃掉当前行末尾的换行符 } for(int i=0;i<n;i++) { for(int j =0;j<m;j++) { printf("%c",list[i][j]); } printf("\n"); // 输出每行后添加换行,还原格式 } return 0; }
方案2:让scanf自动跳过空白字符
在scanf("%c", &list[i][j]);的%c前加一个空格,格式串改成" %c"——空格会让scanf自动跳过所有空白字符(包括换行、空格、制表符),这样就不会把换行符读进数组中。
修改后的代码:
#include <stdio.h> int main() { int n, m; scanf("%d %d", &n, &m); char list[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf(" %c", &list[i][j]); // 空格跳过空白字符 } } for(int i=0;i<n;i++) { for(int j =0;j<m;j++) { printf("%c",list[i][j]); } printf("\n"); } return 0; }
两种方案都能解决换行符干扰的问题,方案2更简洁,无需手动处理每个换行符。
内容的提问来源于stack exchange,提问作者arad asghari
相关产品推荐
相关产品推荐

