ncurses库的使用总结
ncurses库的使用总结
前言
ncurses(new curses)是一个程序库,它提供的API可以允许程序员编写独立于终端的基于文本的用户界面。它是一个虚拟终端中的“类GUI”应用软件工具箱。它还优化了屏幕刷新方法,以减少使用远程shell时遇到的延迟。
一、环境初始化函数
WINDOW *initscr(void)
• 参数:无
• 返回值:返回标准窗口stdscr
的指针;失败返回NULL
。
• 作用:初始化终端进入curses模式,必须在其他ncurses函数前调用。
• 使用注意:每个程序只能调用一次,需与endwin()
配对。int endwin(void)
• 参数:无
• 返回值:成功返回OK
,失败返回ERR
。
• 作用:释放ncurses资源,恢复终端原始状态。需在程序退出前调用。// 示例:初始化与退出 initscr(); // ...其他操作... endwin();
信号处理(非函数原型,但关键)
• 使用场景:防止程序异常终止导致终端显示异常。
• 示例:#include <signal.h> void sig_handler(int signo) { endwin(); exit(0); } signal(SIGINT, sig_handler); // 处理Ctrl+C
二、输入模式控制
int raw(void)
/int cbreak(void)
• 参数:无
• 返回值:成功返回OK
,失败返回ERR
。
• 区别:
◦raw()
:禁用行缓冲和信号处理(如Ctrl+C会直接传递为输入字符)。
◦cbreak()
:禁用行缓冲但保留信号处理。int echo(void)
/int noecho(void)
• 参数:无
• 作用:控制输入回显,noecho()
常用于密码输入等场景。int keypad(WINDOW *win, bool bf)
• 参数:
◦win
:目标窗口(通常为stdscr
)。
◦bf
:TRUE
启用功能键(如方向键/F1-F12),FALSE
禁用。
• 返回值:成功返回OK
,失败返回ERR
。int halfdelay(int tenths)
• 参数:tenths
为等待输入的0.1秒倍数(1-255)。
• 作用:设置输入超时,超时后返回ERR
。
三、屏幕输出与光标控制
- 基础输出函数
•int addch(chtype ch)
◦ 参数:ch
为字符(可组合属性,如ch | A_BOLD
)。
•int printw(const char *fmt, ...)
◦ 参数:类似printf
,支持格式化字符串。
•int addstr(const char *str)
◦ 参数:直接输出完整字符串。 - 光标移动函数
•int move(int y, int x)
◦ 参数:目标坐标(y, x)
(行、列)。
◦ 返回值:成功返回OK
,失败返回ERR
。
•mvaddch(int y, int x, chtype ch)
◦ 等效操作:move(y, x); addch(ch);
。 - 屏幕刷新与清空
•int refresh(void)
:将stdscr
的内容刷新到物理屏幕。
•int erase(void)
:清空stdscr
内容,不重置光标。
•int clear(void)
:清屏并重置光标到(0,0)
。
四、窗口管理
- 窗口创建与销毁
•WINDOW *newwin(int nlines, int ncols, int y, int x)
◦ 参数:窗口行数、列数、起始坐标(y, x)
。
◦ 返回值:新窗口指针。
•int delwin(WINDOW *win)
◦ 注意:需先销毁子窗口再销毁父窗口。 - 窗口操作
•int wrefresh(WINDOW *win)
:刷新指定窗口到屏幕。
•int box(WINDOW *win, chtype verch, chtype horch)
◦ 参数:verch
为垂直边框字符,horch
为水平边框字符。
五、输入处理
- 字符输入
•int getch(void)
◦ 返回值:阻塞模式下等待输入,返回字符或功能键宏(如KEY_LEFT
)。
•int nodelay(WINDOW *win, bool bf)
◦ 参数:bf
为TRUE
时进入非阻塞模式(无输入返回ERR
)。 - 坐标获取宏
•getyx(WINDOW *win, int y, int x)
◦ 作用:获取窗口当前光标坐标(y
和x
需为变量地址)。
•getmaxyx(WINDOW *win, int y, int x)
◦ 作用:获取窗口最大行数和列数。
六、最佳实践示例
#include <ncurses.h>
#include <signal.h>
void sig_handler(int signo) { endwin(); exit(0); }
int main() {
initscr();
signal(SIGINT, sig_handler);
cbreak();
noecho();
keypad(stdscr, TRUE);
printw("Press F1 to exit");
int ch = getch();
if (ch == KEY_F(1)) {
endwin();
return 0;
}
endwin();
}
以上内容综合了多个文档来源,具体函数细节可参考官方手册或相关示例。