【问题标题】:Why doesn't this code position the cursor correctly when I build it with Borland C++?当我使用 Borland C++ 构建时,为什么这段代码不能正确定位光标?
【发布时间】:2023-03-24 02:53:01
【问题描述】:

我发现此代码仅使用 C 标准库替换 gotoxy() 函数。显然它是使用 GCC 编译的,并且像 conio.h 中的 gotoxy() 一样工作。

但是,我只有 Borland C++ v5.5 编译器,它编译得很好,但不会像 conio.h 中的 gotoxy() 那样重新定位光标。任何人都可以验证在使用 GCC 时它是否有效,或者告诉我为什么它在使用 Borland 时无效?

#include<stdio.h>
#include<stdlib.h>

void gotoxy(int x, int y)
{
    printf("%c[%d;%df", 0x1B, y, x);
}

int main()
{
    gotoxy(10, 10);
    printf("hello world");
}

【问题讨论】:

  • Borland 在其conio.h 的副本中有一个gotoxy() 函数。为什么需要更换?

标签: c gcc c++builder c99 borland-c++


【解决方案1】:

函数中使用的转义码取决于终端仿真器中是否存在支持。根据您使用的环境,它可能有效,也可能无效。例如,您的程序在 Mac OS X 的终端应用程序中按预期运行,在 xterm 兼容模式下运行 bash。

您可以阅读ANSI escape codes 以了解有关此特定案例的更多信息,即“HVP – 水平和垂直位置”命令。

【讨论】:

  • 例如,如果您的标准输出连接到打印机,则它不可能重新定位光标,因为没有光标。这取决于您将其发送到的终端的具体情况。
【解决方案2】:

该代码会打印ANSI escape sequence:&lt;esc&gt;[y;xf,因此只能在 ANSI 终端或支持 ANSI 代码的终端仿真器上运行。

问题不在于 GCC 与 BC++,而是在支持 ANSI 代码的 unix-style terminal emulatorWindows CMD window 中运行。

编辑:尝试将gotoxy() 的正文更改为以下内容。示例中的转义码将光标移动到上一行。以 H 结尾的代码应将光标定位到请求的 (Y,X) 坐标。

printf("%c[%d;%dH", 0x1B, y, x);

EDIT2:由于提问者使用的是 Windows CMD 控制台,因此正确的解决方案是使用SetConsoleCursorPosition()。 Win2k 及更高版本不支持或不完全支持 ANSI 转义。

【讨论】:

  • 你想要 SetConsoleCursorPosition(),而不是 ANSI 转义。请参阅我的更新答案以获取链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 2023-03-11
  • 2010-10-24
  • 1970-01-01
相关资源
最近更新 更多