首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 gotoxy 光標定位:中文字符佔兩列導致列錯位解決

     編輯:程式設計綜合問答

現象

打印 10×10 方陣(中文方塊字符 □),gotoxy(9,7) 打印 * 顯示位置偏移:列數約為預期一半,行數截斷。

原因

中文字符在控制台佔據 2 個字符寬度(雙字節字符),但 COORD.X 以字符單元格為單位。打印 □ 時光標實際移動 2 列,導致實際光標位置與邏輯座標脫節。

解決方案

  1. 使用單字節字符:如 [], #, * 等 ASCII 字符繪製方陣。
  2. 座標乘 2:COORD pos = { x * 2, y };(僅適用於全中文輸出場景)。
  3. 設置控制台字體為 TrueType (Consolas) 並啟用虛擬終端序列 (Win10+),使用 ANSI 轉義序列定位:printf("\033[%d;%dH", y+1, x+1);,更精確。

修正代碼

#include <windows.h>
#include <stdio.h>

void gotoxy(int x, int y) {
    COORD pos = { x * 2, y }; // 中文字符寬度 2
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
}

int main() {
    int a = 10;
    for (int i = 0; i < a; i++) {
        for (int j = 0; j < a; j++) printf("□");
        printf("\n");
    }
    gotoxy(9, 7); // 第 10 列(索引9) 第 8 行(索引7)
    printf("中");   // 中文也佔 2 列,對齊
    getchar();
    return 0;
}

最佳實踐

  • 控制台遊戲/繪圖**統一使用 ASCII 字符**,避免寬度不一致問題。
  • 需中文顯示時,使用 WriteConsoleOutputCharacter 直接寫入字符屬性,或改用圖形庫 (EasyX, SDL, Qt)。
  • Win10 1903+ 支持 ENABLE_VIRTUAL_TERMINAL_PROCESSING,可用 ANSI 序列統一控制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved