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

使用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:手动吃掉换行符

修改点:

  1. 去掉scanf("%d %d\n", &n, &m);里的\n,改成scanf("%d %d", &n, &m);——格式串里的\n会匹配任意空白,反而容易导致输入处理异常。
  2. 读取完n和m后,用getchar()吃掉输入流中剩余的换行符。
  3. 每读完一行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:05:21