如果使用CLion编译而不是直接使用gcc编译,C程序会表现出不同的行为。为什么?

3

我正在使用C90编写一个玩四子棋的程序。

我使用ASCII字符为控制台创建了用户界面。

如果我使用C Lion编译程序,我会得到以下输出:

Screenshot C Lion Output

如果我使用gcc main.c编译它,然后运行./a.out,我会得到以下结果:

Screenshot Terminal Output

显然,如果我直接使用gcc编译它,这个点字符的大小会有所不同。

有人知道这可能是怎么发生的吗?

负责打印游戏行的代码如下:

void printGameLine(int line[7]) {
    int i;
    printf("┃");
    for (i = 0; i < 7; ++i) {
        printColor(line[i]);
        line[i] == 0 ? printf("    ") : printf(" ⬤ ");
        printColor(0);
        printf("┃");
    }
    printf("\n");
}

代码负责颜色的部分如下所示:(如果这有任何区别的话)
/**
 * prints the color
 * @param player -1 First player, 0 neutral, 1 Second Player
 */
void printColor(int player) {
    switch (player) {
        case 1:
            printf("\033[0;31m"); /*red*/
            break;
        case -1:
            printf("\033[0;33m");/*yellow*/
            break;
        default:
            printf("\033[0m");/*neutral*/
            break;
    }
}

1
可能 printf(" ⬤ "); 中的点在不同的编译器中被解释为不同的字符。 - Jabberwocky
1
看看在两个编译器上," ⬤ "生成了什么字节序列,你可能会发现答案。 - Jabberwocky
1
printf 的返回值告诉我们打印出来的字符数。 - Weather Vane
1
在第二种情况下,似乎使用了非固定宽度字体来表示点。我相信这个点是一个Unicode字符。UTF-8在2003年被标准化,并于1993年首次引入。C90在1990年不可能知道UTF-8字符是什么。我想知道你是否能够编译它。 - keiv.fly
2
编写一个简单的程序,只输出 printf(" ⬤ ");,然后将其导入到 hexdump 中。 - Eugene Sh.
显示剩余10条评论
1个回答

3
问题在于CLion控制台的字体选择。
  • 前往 文件/[设置...],然后 编辑器/[颜色主题]/[控制台字体]
  • 禁用"使用控制台字体代替默认字体"复选框
  • 选择您喜欢的适当等宽字体(我使用Fira Code)

Configuration screenshot

之后,请确保对于空位置和“球形”位置使用相同长度的字符串。


我已经重现了您的问题,并通过上述步骤进行了修复。尝试在控制台上打印“mmm\niii\n”。如果打印字符串的长度不同,则说明您仍在使用一些比例字体在您的控制台上:比例字体:“mmm”/“iii”;等宽字体:“mmm”/“iii”。 - flaviodesousa
1
工作图像是我直接使用播放按钮运行代码的情况。另一张图片是在同一个控制台中使用"./..../ForInARow"命令运行相同文件后发生的情况。 - Tobias Kiehnlein
1
我明白了。在等宽字体中,U+2b24是一个“行为不良”的字符,它既更宽,也会溢出到下一个字符(这就解释了为什么后面的空格看起来更细)。也许你可以用U+25cf(或稍微不那么“行为不良”的U+26ab)来替换它。它们看起来不是很好看,但是符合等宽字体的期望。这段代码展示了它的糟糕表现:printf("\niii\nmmm\n⬤⬤⬤\n ⬤\n●●● U+25cf\n ●\n⚫⚫⚫ U+26ab\n ⚫");。另一种解决方案可能是在空单元格上打印黑色的U+2b24,但是我的尝试使用 "\033[0;30m" 没有成功。 - flaviodesousa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接