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

二维数组长度不符:C语言棋盘程序外层循环提前终止问题

问题原因及修复方案

你的代码如下:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int size_plansza;
    scanf("%d",&size_plansza);
    char plansza[size_plansza][size_plansza];
    char pozycja;
    for (int i=0;i<size_plansza;i++)
    {
        for (int j=0;j<size_plansza;j++)
        {
            scanf("%c",&pozycja);
            plansza[i][j] = pozycja;
        }

    }

    printf("%s",plansza);
    return 0;
}

问题核心原因

输入缓冲区残留的换行符导致读取错位:
当用scanf("%d", &size_plansza)读取棋盘尺寸后,你输入数字时按下的回车键会留下一个\n字符在输入缓冲区中。后续的scanf("%c")会优先读取这个换行符,而非你输入的棋盘字符。
比如size=5时:

  • 输入5+回车后,缓冲区剩下\n
  • 第一次外层循环的内层循环会先读这个\n,再读第一行的前4个字符,就完成了5次读取
  • 后续循环持续错位,最终导致外层循环提前结束,只处理了size-1行有效棋盘内容

修复方案

方案1:读取尺寸后清除换行符

在读取size的代码后,添加getchar()吃掉残留的换行符:

scanf("%d",&size_plansza);
getchar(); // 清除输入size后的换行符

方案2:修改scanf格式串跳过空白字符

在%c前添加一个空格,让scanf自动跳过所有空白字符(包括换行、空格、制表符):

scanf(" %c",&pozycja); // %c前的空格会跳过空白字符

额外修正:输出逻辑错误

直接用printf("%s", plansza)输出二维字符数组会导致乱码,因为%s要求字符串以\0结尾,但你的棋盘数组中没有终止符。建议改成逐行输出:

// 替换原printf("%s",plansza);
for (int i=0;i<size_plansza;i++)
{
    for (int j=0;j<size_plansza;j++)
    {
        printf("%c", plansza[i][j]);
    }
    printf("\n"); // 每行结束换行,还原棋盘格式
}

内容的提问来源于stack exchange,提问作者Jakub Łaszewski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:25:26