Использование функции 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
,