You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:40:13