我现在只是在使用在线编译器。 onlinegdb.com 正在考虑是否有办法使 x 居中,以便在每个编译器中都相同。
可能与否不是由您使用的编译器决定的,而是由平台和您准备编写的代码量决定的。
标准 C 不知道控制台、窗口和其他平台相关的东西。如果您想了解有关控制台属性的信息,您必须询问控制台/操作系统。还有像ncurses这样的POSIX库,允许POSIX系统可以运行的不同终端被统一对待。
可用于 DOS、OS/2、Win32、X11 和 SDL 的 ncurses 库的实现是 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
请注意 OnlineGDBs 对 ncurses 及其“终端”的支持已损坏。 getyx() 不会告诉它控制台的实际宽度。
*) 文档说您应该在退出程序之前调用endwin()。如果您使用 OnlineGDB 这样做,您将不会从 OnlineGDB 获得任何可见的输出。只有当您单击“复制输出到剪贴板”按钮并查看复制的文本时,您才会看到ncurses 生成的 ANSI 转义序列。