我的C语言ASCII字符打印代码显示异常,请求排查修复
问题排查与修复
核心问题:字体索引计算错误
你代码中myprint函数里的font_index计算公式错误,导致读取了字体数组中错误的位置:
int font_index = font_start_index+i+a*F_WIDTH*(F_CHARS-1);
字体数组的每一行包含所有11个字符的该行像素,每行长度应为F_CHARS * F_WIDTH(11*5=55),而非F_WIDTH*(F_CHARS-1)。错误的偏移量导致读取的字符位置混乱,无法正确渲染出字母A。
修复方案
1. 修正字体索引计算
将font_index的计算公式修改为:
int font_index = font_start_index + i + a * F_CHARS * F_WIDTH;
公式逻辑:
font_start_index:当前字符在字体数组中的起始列位置i:当前字符的列偏移(0到F_WIDTH-1)a * F_CHARS * F_WIDTH:当前字符的行偏移(每一行占F_CHARS*F_WIDTH个字符)
2. 优化遍历顺序(可选)
将循环顺序调整为先遍历行、再遍历列,逻辑更贴合字体数组的存储结构,不影响结果但可读性更强:
for (int a = 0; a < F_HEIGHT; a++){ for (int i = 0; i < F_WIDTH; i++){ // 索引计算与赋值逻辑 } }
修复后的完整myprint函数
void myprint(int x, int y, char* strings){ while (*strings != 0){ int font_start_index = (*strings - 'A') * F_WIDTH; for (int a = 0; a < F_HEIGHT; a++){ for (int i = 0; i < F_WIDTH; i++){ int font_index = font_start_index + i + a * F_CHARS * F_WIDTH; char font_character = font[font_index]; int screen_index = x + i + (y + a) * S_WIDTH; screen[screen_index] = font_character; } } x += F_WIDTH; strings++; } }
验证结果
修复后调用myprint(5,2,"A"),终端会正确输出第2行第5列的ASCII字母A:
........................................ ........................................ ..... xx .............................. ....x x............................... ....xxxx............................... ....x x............................... ....x x............................... ........................................ ........................................ ........................................
内容的提问来源于stack exchange,提问作者albin
相关产品推荐
相关产品推荐

