我一直在寻找一种从我的C程序中获得终端宽度的方法.我一直在想的是:

#include <sys/ioctl.h>
#include <stdio.h>

int main (void)
{
    struct ttysize ts;
    ioctl(0, TIOCGSIZE, &ts);

    printf ("lines %d\n", ts.ts_lines);
    printf ("columns %d\n", ts.ts_cols);
}

但每次我试着

austin@:~$ gcc test.c -o test
test.c: In function ‘main’:
test.c:6: error: storage size of ‘ts’ isn’t known
test.c:7: error: ‘TIOCGSIZE’ undeclared (first use in this function)
test.c:7: error: (Each undeclared identifier is reported only once
test.c:7: error: for each function it appears in.)

这是最好的方法,还是有更好的方法?如果没有,我如何才能让它工作?

编辑:固定代码为

#include <sys/ioctl.h>
#include <stdio.h>

int main (void)
{
    struct winsize w;
    ioctl(0, TIOCGWINSZ, &w);

    printf ("lines %d\n", w.ws_row);
    printf ("columns %d\n", w.ws_col);
    return 0;
}

推荐答案

你考虑过用getenv()吗?它允许您获取包含终端列和行的系统环境变量.

或者,使用您的方法,如果您想查看内核认为终端大小是什么(如果终端大小调整,效果更好),则需要使用TIOCGWINSZ,而不是TIOCGSIZE,如下所示:

struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

以及完整的代码:

#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

int main (int argc, char **argv)
{
    struct winsize w;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

    printf ("lines %d\n", w.ws_row);
    printf ("columns %d\n", w.ws_col);
    return 0;  // make sure your main returns int
}

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

不会停在空格或换行符上的错误

将fget()与strcMP()一起使用不是正确的比较

如何将字符串传递给函数并返回在C中更改的相同字符串?

为什么我一直收到分段错误?

文件权限为0666,但即使以超级用户身份也无法打开

使用sscanf获取零个或多个长度的字符串

如何在下面的C代码中正确管理内存?

每次除以或乘以整数都会得到0.0000

为 struct 中的数组动态分配内存时出错

处理EPOLL_WAIT中的接收数据和连接关闭信号

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

覆盖读取函数,但当文件描述符为3或4时,我有问题

从C中的函数返回静态字符串是不是一种糟糕的做法?

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

为什么<到达*时不会转换为>?

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648