二维数组长度不符: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
相关产品推荐
相关产品推荐

