如何用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
相关产品推荐
相关产品推荐

