我想设置光标位置以在控制台屏幕上打印char
。有没有使用ncurses
库的解决方案。
下面的example是否在Linux中对SetConsoleCursorPosition
进行了等效调用:
void print (int x, int y, char c) {
COORD p = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p);
printf("%c", c);
}
答案 0 :(得分:7)
也许有点历史。你在Windows中称之为“控制台”的确是一个终端模拟器的例子;但是,与传统的终端仿真器不同,Windows通过其Console API提供对终端的直接访问。终端(以及终端仿真器)采用的传统方法是解释转义序列,每个转发序列指示终端执行某些操作。
不幸的是,正如您可能想象的那样,终端'功能变化很大(有些甚至可以绘制一种或另一种图形),因此并非所有终端都使用相同的转义序列集。这些天你遇到一些没有实现ANSI/VT100 escapes超集的东西是非常不幸的。如果您乐意只支持ANSI / VT100及衍生产品,您可以发送ESC [ n ; m H
,其中 n 是行号, m 是列号
但是,如果您做这样做,那么如果代码出现异国情况,您的代码将无法运行。在这种情况下,你真的应该考虑使用curses库(ncurses是一个常见但不是唯一的例子),即使你只是用它来从terminfo数据库中提取信息(尽管我强烈推荐)只使用curses库。)
最后,请注意:您引用Windows的代码一定不会起作用(!)为什么?因为printf()
确实缓冲了输出,并且无法保证在再次更改光标位置之前将字符发送到控制台。您可以使用fflush(stdout)
解决此问题,但老实说,如果您正在使用SetConsoleCursorPosition
,您也可以使用WriteConsole
并完成它。
其他有用信息
您实际上可以获得在Windows上运行的curses版本;见例如PDCurses。如果您使用curses,那么您也不需要任何特定于Windows的代码,和您可以使用任何正在使用的终端。