使用gotoxy()函数将X坐标居中

时间:2018-10-18 15:06:58

标签: c conio

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

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

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

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

    printf("Test");

    return 0;
}

1 个答案:

答案 0 :(得分:0)

  

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

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

标准C不了解控制台,Windows和其他平台相关的内容。如果您想了解有关控制台属性的信息,则必须询问控制台/操作系统。也有类似ncurses的POSIX库,该库允许在不同的终端上运行POSIX系统。

ncurses库的一种可用于DOS,OS / 2,Win32,X11和SDL的实现是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,包括<curses.h>而不是<ncurses.h>

#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

请注意,OnlineGDB对ncurses及其“终端”的支持已中断。 getyx()不会告诉您控制台的实际宽度。

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