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
相关产品推荐
相关产品推荐

