Использование функции gotoxy() для центрирования координаты X

Я хочу написать что-то, используя printf, также центрируя координату x и y=0.

Как я могу центрировать координату х? Например, у кого-то может быть открыто окно компилятора в полноэкранном режиме, а у других - нет? Я хочу текст в середине. Прямо сейчас х назначается случайное значение (50)

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

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

    printf("Test");

    return 0;
}

1 ответ

Я просто использую онлайн-компилятор прямо сейчас. onlinegdb.com Подумал, есть ли способ центрировать x так, чтобы он был одинаковым в каждом компиляторе.

То, что возможно или нет, определяется не компилятором, который вы используете, а платформой и количеством кода, который вы готовы написать.

Стандарт C не имеет представления о консолях, окнах и других зависимых от платформы вещах. Если вы хотите узнать что-то о свойствах ваших консолей, вы должны спросить у консоли / операционной системы. Есть также библиотеки, такие как 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(); // *)
}

Live: https://onlinegdb.com/HkIpXBUim

Обратите внимание, что поддержка OnlineGDBs для ncurses с его "терминалом" не работает. getyx() не скажу реальную ширину своей консоли.

*) В документации сказано, что вам следует позвонить endwin() перед выходом из вашей программы. Если вы сделаете это с OnlineGDB, вы вообще не получите никакого видимого вывода от OnlineGDB. Только если вы нажмете кнопку "Копировать вывод в буфер обмена" и просмотрите скопированный текст, вы увидите escape-последовательности ANSI, созданные ncurses,

Другие вопросы по тегам