C语言矩阵坐标映射问题:如何定位输入坐标对应矩阵位置并完成值替换
C语言矩阵坐标交互功能实现问题梳理
项目预设目标
- 基础矩阵定义:创建5行6列的字符矩阵,默认所有位置填充
. - 标准初始输出格式:
5:...... 4:...... 3:...... 2:...... 1:...... abcdef
- 坐标与矩阵存储的映射规则:
- 数组第一维度(行)和显示行的对应:数组第0行对应屏幕上显示的第5行,数组第1行对应显示的第4行,依次类推数组第4行对应显示的第1行
- 数组第二维度(列)和显示列的对应:
a对应数组第0列,b对应第1列,c对应第2列,d对应第3列,e对应第4列,f对应第5列 - 全量映射关系示例:
- 数组第0行:
{"a5", "b5", "c5", "d5", "e5", "f5"} - 数组第1行:
{"a4", "b4", "c4", "d4", "e4", "f4"} - 数组第2行:
{"a3", "b3", "c3", "d3", "e3", "f3"} - 数组第3行:
{"a2", "b2", "c2", "d2", "e2", "f2"} - 数组第4行:
{"a1", "b1", "c1", "d1", "e1", "f1"}
- 数组第0行:
- 交互逻辑要求:输入形如
a5的坐标字符串时,将矩阵对应位置替换为X,例如输入a5后的输出效果:
5:X..... 4:...... 3:...... 2:...... 1:...... abcdef
现有已编写代码
int main () { //definir tabuleiro int linhas = 5; int colunas = 6; char tabuleiro [linhas][colunas]; char input [80]; // Definir as posições do tabuleiro char coordenadacolaux; char coordenadalinaux; int coordenadalin ; int coordenadacol ; printf("%d is col, %d is ln\n", coordenadacol, coordenadalin); //Preencher o tabuleiro com '.' memset(tabuleiro, '.', sizeof tabuleiro); scanf("%s",input); coordenadacolaux = input[0]; coordenadalinaux = input[1]; printf("%d is col, %d is ln\n", coordenadacol, coordenadalin); switch (coordenadacolaux) { case 'a': coordenadacol = 0; printf("In a \n"); printf("a is %d \n",coordenadacol); break; case 'b': coordenadacol = 1; printf("In b\n"); printf("b is %d \n",coordenadacol); break; case 'c': coordenadacol = 2; printf("In c\n"); printf("c is %d \n",coordenadacol); break; case 'd': coordenadacol = 3; printf("In d\n"); printf("d is %d \n",coordenadacol); break; case 'e': coordenadacol = 4; printf("In e\n"); printf("e is %d \n",coordenadacol); break; default: printf("Casa invalida."); } //cast = tranformar char em int coordenadalin = (int) coordenadalinaux; printf("%c is col, %c is ln\n", coordenadacol, coordenadalin); tabuleiro[coordenadacol][coordenadalin] = 'X'; for(int count=5, i=0; i<linhas; i++, count--) { printf("%d:", count) ; for(int j=0; j<colunas; j++) { printf("%c", tabuleiro[i][j]); } printf("\n"); } printf(" abcdef"); }
代码现存的核心问题
- 行坐标转换逻辑完全错误:直接把数字字符
coordenadalinaux强转为int,得到的是该字符的ASCII码值(比如字符'5'强转后值为53),不是实际需要的行索引数值 - 二维数组索引顺序写反:现有代码赋值时写为
tabuleiro[coordenadacol][coordenadalin],把列索引当成了二维数组的第一维度(行索引),行索引当成了第二维度(列索引),和C语言二维数组第一参数指定行、第二参数指定列的规则相悖 - switch分支缺少
f列的匹配逻辑,输入f开头的坐标会被判定为非法输入,无法正确映射对应列号 - 存在未定义行为:
coordenadalin、coordenadacol在首次打印时完全没有赋值,属于未初始化的野值读取 - 缺失输入合法性校验:没有判断输入字符串长度是否合规、坐标数值是否在矩阵范围内,极易引发数组越界的崩溃问题
可行的修正实现思路
- 简化列坐标计算逻辑:利用字符ASCII编码的连续性,直接通过
coordenadacol = coordenadacolaux - 'a'计算列索引,无需手写全量switch分支,自动覆盖a-f所有列的映射关系 - 修正行坐标转换逻辑:数字字符转实际数值的通用规则是
数字字符 - '0',再结合矩阵的显示倒序规则计算对应的数组行索引:数组行索引 = 5 - 输入的行数字值。比如输入行值为5,对应数组行号为0;输入行值为1,对应数组行号为4,和预设的映射关系完全匹配 - 调整矩阵赋值的索引顺序:严格按照
tabuleiro[行索引][列索引] = 'X'的规则填写参数,纠正之前写反的索引顺序 - 补充输入校验逻辑:依次判断输入长度是否为2、列字符是否在a-f范围内、行数字是否在1-5范围内,不满足条件就提示非法输入,避免数组越界风险
内容的提问来源于stack exchange,提问作者Alegor Mané
相关产品推荐
相关产品推荐

