You need to enable JavaScript to run this app. C语言初学者实现按输入坐标绘制20x20星号矩阵的求助
优惠活动
大模型
产品
解决方案
定价
更多

C语言初学者实现按输入坐标绘制20x20星号矩阵的求助

代码问题排查与修正

核心逻辑bug说明

  • 矩阵输出阶段的索引引用错误:双层循环遍历矩阵位置时,判断条件和输出值都误引用了录入循环结束后残留的变量a、b——这两个变量存储的是最后一次录入的坐标值,和当前正在遍历的矩阵坐标i(行号)、j(列号)完全无关,会导致整个输出矩阵全部重复输出最后一个坐标对应的内容,和预期效果完全偏离。
  • 缺少输入合法性校验:没有判断用户输入的坐标是否落在[0,19]的合法范围内,一旦输入超边界的坐标,会触发C语言数组越界访问,轻则程序输出乱码,重则直接崩溃。
  • 存储逻辑冗余困惑:不需要额外开辟独立数组存储所有输入的坐标,直接使用20*20的矩阵作为存储载体即可,录入坐标时直接给矩阵对应位置赋值星号,输出时逐位置读取矩阵值,比单独存坐标再逐点匹配的写法效率更高、逻辑更简洁。

修正后的可运行代码

#include <stdio.h>
int main()
{
    int n, i, j, a, b;
    // 20*20大小的字符矩阵,初始值全部为0(空)
    char m[20][20] = {{0}};
    const char star = '*';
    printf("请输入坐标点的数量:");
    scanf("%d", &n);
    // 循环录入所有指定坐标
    for (i = 0; i < n; i++)
    {
        printf("请输入第%d个坐标(格式为 行 列,取值范围0-19):", i + 1);
        scanf("%d %d", &a, &b);
        // 越界提示,避免非法输入
        while (a < 0 || a >= 20 || b < 0 || b >= 20)
        {
            printf("坐标超出[0,19]合法范围,请重新输入:");
            scanf("%d %d", &a, &b);
        }
        m[a][b] = star;
    }
    // 逐行逐列输出完整矩阵
    for (i = 0; i < 20; i++)
    {
        for (j = 0; j < 20; j++)
        {
            // 直接引用当前遍历到的矩阵位置值,无标记的位置输出空格
            printf("%c", m[i][j] == 0 ? ' ' : m[i][j]);
        }
        printf("\n");
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 13:24:04