C/C++Unix/Linux应用层编程基本原理

ncurses库的使用总结

ncurses库的使用总结


前言

ncurses(new curses)是一个程序库,它提供的API可以允许程序员编写独立于终端的基于文本的用户界面。它是一个虚拟终端中的“类GUI”应用软件工具箱。它还优化了屏幕刷新方法,以减少使用远程shell时遇到的延迟。


一、环境初始化函数

  1. WINDOW *initscr(void)
    参数:无
    返回值:返回标准窗口stdscr的指针;失败返回NULL
    作用:初始化终端进入curses模式,必须在其他ncurses函数前调用。
    使用注意:每个程序只能调用一次,需与endwin()配对。
  2. int endwin(void)
    参数:无
    返回值:成功返回OK,失败返回ERR
    作用:释放ncurses资源,恢复终端原始状态。需在程序退出前调用。

    // 示例:初始化与退出
    initscr();
    // ...其他操作...
    endwin();
  3. 信号处理(非函数原型,但关键)
    使用场景:防止程序异常终止导致终端显示异常。
    示例

    #include <signal.h>
    void sig_handler(int signo) { endwin(); exit(0); }
    signal(SIGINT, sig_handler);  // 处理Ctrl+C

二、输入模式控制

  1. int raw(void) / int cbreak(void)
    参数:无
    返回值:成功返回OK,失败返回ERR
    区别
    raw():禁用行缓冲和信号处理(如Ctrl+C会直接传递为输入字符)。
    cbreak():禁用行缓冲但保留信号处理。
  2. int echo(void) / int noecho(void)
    参数:无
    作用:控制输入回显,noecho()常用于密码输入等场景。
  3. int keypad(WINDOW *win, bool bf)
    参数
    win:目标窗口(通常为stdscr)。
    bfTRUE启用功能键(如方向键/F1-F12),FALSE禁用。
    返回值:成功返回OK,失败返回ERR
  4. int halfdelay(int tenths)
    参数tenths为等待输入的0.1秒倍数(1-255)。
    作用:设置输入超时,超时后返回ERR

三、屏幕输出与光标控制

  1. 基础输出函数
    int addch(chtype ch)
    参数ch为字符(可组合属性,如ch | A_BOLD)。
    int printw(const char *fmt, ...)
    参数:类似printf,支持格式化字符串。
    int addstr(const char *str)
    参数:直接输出完整字符串。
  2. 光标移动函数
    int move(int y, int x)
    参数:目标坐标(y, x)(行、列)。
    返回值:成功返回OK,失败返回ERR
    mvaddch(int y, int x, chtype ch)
    等效操作move(y, x); addch(ch);
  3. 屏幕刷新与清空
    int refresh(void):将stdscr的内容刷新到物理屏幕。
    int erase(void):清空stdscr内容,不重置光标。
    int clear(void):清屏并重置光标到(0,0)

四、窗口管理

  1. 窗口创建与销毁
    WINDOW *newwin(int nlines, int ncols, int y, int x)
    参数:窗口行数、列数、起始坐标(y, x)
    返回值:新窗口指针。
    int delwin(WINDOW *win)
    注意:需先销毁子窗口再销毁父窗口。
  2. 窗口操作
    int wrefresh(WINDOW *win):刷新指定窗口到屏幕。
    int box(WINDOW *win, chtype verch, chtype horch)
    参数verch为垂直边框字符,horch为水平边框字符。

五、输入处理

  1. 字符输入
    int getch(void)
    返回值:阻塞模式下等待输入,返回字符或功能键宏(如KEY_LEFT)。
    int nodelay(WINDOW *win, bool bf)
    参数bfTRUE时进入非阻塞模式(无输入返回ERR)。
  2. 坐标获取宏
    getyx(WINDOW *win, int y, int x)
    作用:获取窗口当前光标坐标(yx需为变量地址)。
    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();
}

以上内容综合了多个文档来源,具体函数细节可参考官方手册或相关示例。

回复

This is just a placeholder img.