获取Windows的终端大小?

Dr *_*eco 17 c size console windows-console

如何在Windows下使用普通c在控制台窗口中检查ymax和xmax?

这段代码用于linux:

#include <stdio.h>
#include <sys/ioctl.h>
int main (void)
{
    struct winsize max;
    ioctl(0, TIOCGWINSZ , &max);
    printf ("lines %d\n", max.ws_row);
    printf ("columns %d\n", max.ws_col);
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何为Windows做同样的事情.我试过winioctl.h但它没有定义struct winsize任何其他类似的名称.

有小费吗?谢谢.

PS.在linux中,您还可以使用找到控制台大小getenv("LINES");.Windows下有类似的变量吗?

PPS.此外,总有一种情况ncurses.h,我认为这两种系统都可以工作,但是由于与我所拥有的其他库的冲突,我正在避免它.

购买力平价.这个问题在这里得到C的终端宽度?有很多提示,所以不需要重复.

qua*_*tum 28

这将打印控制台的大小,而不是缓冲区:

#include <windows.h>

int main(int argc, char *argv[]) {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    int columns, rows;

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
    rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;

    printf("columns: %d\n", columns);
    printf("rows: %d\n", rows);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码有效,因为srWindow"包含显示窗口的左上角和右下角的控制台屏幕缓冲区坐标",并且SMALL_RECT结构"根据MSDN指定屏幕缓冲区字符单元格的行和列".我减去了平行边以获得控制台窗口的大小.由于我1的实际价值低于实际值,我加了一个.

  • 如果 STDOUT 重定向到文件,则“GetConsoleScreenBufferInfo()”调用将返回“FALSE”,因此应该进行测试。 (2认同)

Dr *_*eco 6

(部分答案)

这段代码:

CONSOLE_SCREEN_BUFFER_INFO csbi;
int ret;
ret = GetConsoleScreenBufferInfo(GetStdHandle( STD_OUTPUT_HANDLE ),&csbi);
if(ret)
{
    printf("Console Buffer Width: %d\n", csbi.dwSize.X);
    printf("Console Buffer Height: %d\n", csbi.dwSize.Y);
}
Run Code Online (Sandbox Code Playgroud)

给出缓冲区的大小.唯一的问题是,这dwSize.Y不是屏幕的大小(这里300而不是25行).但dwSize.X匹配列的编号.只windows.h需要工作.