Использование функции gotoxy () для центрирования координаты X - PullRequest
0 голосов
/ 18 октября 2018

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

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

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

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

    printf("Test");

    return 0;
}

1 Ответ

0 голосов
/ 18 октября 2018

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

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

Стандарт C не имеет представления о консолях, окнах и других зависимых от платформы вещах.Если вы хотите узнать что-то о свойствах ваших консолей, вы должны спросить консоль / операционную систему.Существуют также библиотеки, такие как ncurses для POSIX, которые позволяют различным терминалам работать на POSIX-системах.

Реализация библиотеки ncurses, доступной для DOS, OS / 2, Win32X11 и 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

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

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

...