Я сейчас использую онлайн-компилятор.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
.