C语言创建12×12网格:int转char后数字位置输出乱码求助
解决12×12网格行列头部数字乱码问题
问题根源
你遇到的乱码问题核心在于整数到字符的转换逻辑错误:
- ASCII编码中,数字字符
'0'到'9'的对应数值是48到57,而你直接将整数i/b(0-11)赋值给char类型,加0没有任何作用——这相当于把整数数值直接作为ASCII码使用,0-11对应的是不可见的控制字符,自然输出乱码。 - 额外问题:12×12网格的行列头部是0-11,其中10、11是两位数,单个
char无法存储完整数字,直接用%c输出会显示错误字符,需要调整输出逻辑。
解决方案1:修正字符转换+适配两位数输出
保留你原有的二维数组结构,修正字符转换逻辑,并在输出时单独处理两位数的行列头部:
#include <stdio.h> #define SizeX 12 #define SizeY 12 void creatGrid(){ char theGrid[SizeX][SizeY]; // 初始化网格 for(int b = 0; b < SizeY; b++){ for(int i = 0; i < SizeX; i++){ if(b == 0 || i == 0){ // 0-9的数字可以直接转成字符,10-11用空格占位,输出时单独处理 if((b == 0 && i <= 9) || (i == 0 && b <= 9)){ theGrid[i][b] = (b == 0 ? i : b) + '0'; } else { theGrid[i][b] = ' '; } } else { theGrid[i][b] = '.'; } } } // 打印网格 for(int i = 0; i < SizeY; i++){ for(int a = 0; a < SizeX; a++){ if(i == 0 || a == 0){ // 行列头部直接打印数字,用%2d保证对齐 printf("%2d ", (i == 0) ? a : i); } else { printf("%c ", theGrid[a][i]); } } printf("\n"); } } int main(){ creatGrid(); return 0; }
解决方案2:简化逻辑,直接输出
不需要提前初始化数组,直接在打印时判断位置输出对应内容,代码更简洁,彻底避免字符存储的问题:
#include <stdio.h> #define SizeX 12 #define SizeY 12 void creatGrid(){ for(int row = 0; row < SizeY; row++){ for(int col = 0; col < SizeX; col++){ if(row == 0 && col == 0){ printf(" "); // 左上角空白占位 } else if(row == 0){ printf("%2d ", col); // 第一行打印列号 } else if(col == 0){ printf("%2d ", row); // 第一列打印行号 } else { printf(". "); // 其余位置打印. } } printf("\n"); } } int main(){ creatGrid(); return 0; }
关键说明
- 整数转数字字符的正确方式是加上字符常量
'0',比如i + '0',这样才能得到对应数字的ASCII编码。 - 对于两位数的数字,单个
char无法存储,直接用printf的%2d格式输出可以保证网格对齐,视觉效果更整洁。
内容的提问来源于stack exchange,提问作者BZS
相关产品推荐
相关产品推荐

