You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ncurses获取终端尺寸?Windows下代码无法更新尺寸值问题

问题分析与解决方案

你的代码问题出在反复销毁并重建curses会话,以及没有正确触发终端尺寸的重新获取:

  • 循环内每次调用endwin()会终止curses模式,再调用initscr()重建会话,但Windows下的curses实现(比如PDCurses)在这种重复初始化的场景下,无法正确读取更新后的终端尺寸,反而会保留旧的缓存值。
  • 终端尺寸改变后,curses不会自动更新内部的窗口尺寸数据,需要主动触发重新计算。

修复后的代码

#include <stdio.h>
#include <curses.h>

int main(){
    initscr();
    cbreak();  // 禁用行缓冲,让按键立即生效
    noecho();  // 不回显按键输入,可选优化

    while(1){
        clear();
        printw("[y:%d / x:%d]\n", getmaxy(stdscr), getmaxx(stdscr));
        refresh();
        getch();
        
        // 主动让curses重新获取终端当前尺寸
        resize_term(0, 0);
    }

    endwin();
    return 0;
}

关键修改说明

  • 移除循环内的endwin()和initscr(),只在程序启动和结束时分别调用一次,保持curses会话的连续性。
  • 添加resize_term(0, 0):这个函数会强制curses重新读取终端的实际尺寸,参数0,0表示使用终端当前的宽高,而非指定固定值。
  • 可选的cbreak()和noecho():优化按键交互体验,让按键无需回车即可触发,且不显示输入的字符。

额外说明

如果使用的是PDCurses(Windows下常用的curses实现),确保编译时链接正确的库文件(比如pdcurses.lib),并且运行程序的终端支持尺寸动态调整(比如Windows Terminal或CMD)。

内容的提问来源于stack exchange,提问作者B2n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:27:05