【问题标题】:Using the gotoxy() function to center X coordinate使用 gotoxy() 函数使 X 坐标居中
【发布时间】:2018-10-18 15:06:58
【问题描述】:

我想用 printf 写一些东西,同时还要使 x 坐标和 y=0 居中。

如何使 x 坐标居中?例如,有人可能会全屏打开他们的编译器窗口,而其他人可能不会?我想要中间的文字。现在 x 被分配一个随机值 (50)

#include <stdio.h>
#include <conio.h>

int main()
{
    gotoxy(50,0);

    printf("Test");

    return 0;
}

【问题讨论】:

  • 哪个平台?
  • 我认为您需要回答的问题是,“我正在写入的控制台窗口有多宽?”
  • C,这就是你要问的吗?没有把握。我在 Windows 上。 1920x1080 @TimRandall 是的,这也是真的。
  • 避免无端的 UI 花里胡哨。
  • 在 Tim 看来,conio 的某些版本定义了 screenwidth 变量。

标签: c conio


【解决方案1】:

我现在只是在使用在线编译器。 onlinegdb.com 正在考虑是否有办法使 x 居中,以便在每个编译器中都相同。

可能与否不是由您使用的编译器决定的,而是由平台和您准备编写的代码量决定的。

标准 C 不知道控制台、窗口和其他平台相关的东西。如果您想了解有关控制台属性的信息,您必须询问控制台/操作系统。还有像ncurses这样的POSIX库,允许POSIX系统可以运行的不同终端被统一对待。

可用于 DOS、OS/2、Win32、X11 和 SDL 的 ncurses 库的实现是 PDCurses。它可用于编写与平台无关的代码。

但既然你提到你的平台是windows,这里是一个只使用WinAPI的解决方案:

#include <stddef.h>
#include <stdio.h>
#include <string.h>

#include <windows.h>

COORD get_console_dimensions(void)
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    COORD dimensions = { csbi.srWindow.Right - csbi.srWindow.Left,
                         csbi.srWindow.Bottom - csbi.srWindow.Top };
    return dimensions;
}

COORD get_console_cursor_pos(void)
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    return csbi.dwCursorPosition;
}

void gotoxy(short x, short y)
{
    COORD pos = { x, y };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void puts_centered(char const *str)
{
    size_t length = strlen(str);
    short x = (short)(get_console_dimensions().X - length) / 2;
    gotoxy(x, get_console_cursor_pos().Y);
    puts(str);
}

int main(void)
{
    puts_centered("Hello, World!");
}

使用ncurses 可以达到同样的效果(也可以使用PDCurses,包括&lt;curses.h&gt; 而不是&lt;ncurses.h&gt;):

#include <string.h>

#include <ncurses.h>

int main(void)
{
    initscr();
    int max_x = getmaxx(stdscr);
    int y, x;
    getyx(stdscr, y, x);
    char const *str = "Hello, World!\n";
    mvaddstr(y, (max_x - strlen(str)) / 2, str);
    refresh();
    // endwin(); // *)
}

直播:https://onlinegdb.com/HkIpXBUim

请注意 OnlineGDBs 对 ncurses 及其“终端”的支持已损坏。 getyx() 不会告诉它控制台的实际宽度。

*) 文档说您应该在退出程序之前调用endwin()。如果您使用 OnlineGDB 这样做,您将不会从 OnlineGDB 获得任何可见的输出。只有当您单击“复制输出到剪贴板”按钮并查看复制的文本时,您才会看到ncurses 生成的 ANSI 转义序列。

【讨论】:

  • It doesn't quite work 与 OP 的当前编译器。
  • @n.m. It doesn't quite work 使用 OP 当前的编译器,尽管使用了 OnlineGDB 声称支持的 ncurses。
  • 虽然它比基于 Windows 的解决方案好很多。它编译、运行,它的行为就像终端是 80 个字符宽一样。这在基于浏览器的环境中并非完全不合理。但这不是重点。关键是,OP 最初的基于 conio.h 的程序也可以在那里工作。
猜你喜欢
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多