Linux curses库使用

Linux curses库使用相信您在网路上一定用过如 tin elm 等工具 这些软体有项共同的特色 即他们能利用上下左右等方向键来控制游标的位置 除此之外 这些程式的画面也较为美观 对 Programming 有兴趣的朋友一定对此感到好奇 也许他能在 PC 上用 TurboC 轻易地写出类似的程式 然而 但当他将相同的程式一字不变地移到工作站上来编译时 却出现一堆抓也抓不完的错误 其实 原因很简单

相信您在网路上一定用过如 tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式的画面也较为美观. 对Programming 有兴趣的朋友一定对此感到好奇, 也许他能在PC上用Turbo C轻易地写出类似的程式, 然而, 但当他将相同的程式一字不变地移到工作站上来编译时, 却出现一堆抓也抓不完的错误. 其实, 原因很简单, 他使用的函式库可能在 UNIX 上是没有定义的. 有些在 Turbo-C 上被广泛使用的一些函式, 可能在 UNIX 上是不被定义的. 为了因应网路上各式各样的终端机形态 (terminal), UNIX 上特别发展出一套函式库,专门用来处理 UNIX 上游标移动及萤幕的显示. 这就是本篇文章要为您介绍的 – curses.h 函式库. 利用这个函式库, 您也可以写出像 elm 般利用方向键来移动光棒位置的程式.

 

 

1. curses 的历史与版本:

    cureses 最早是由柏克莱大学的 Bill Joy 及 Ken Arnold 所发展出来的. 当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设计的. 因此, 利用 curses 发展出来的程式将和您所使用的终端机无关. 也就是说, 您不必担心您的程式因为换了一部终端机而无法使用. 这对程式设计师而言, 尤其是网路上程式的撰写, 是件相当重要的一件事. curses之所以能对上百种以上的终端机工作, 是因为它将所有终端机的资料, 存放在一个叫 termcap 的资料库, ( 而在第二版的 System V 系统中, 新版的 curses 以 terminfo 取代原来的 termcap).

    有了这些记录, 程式就能够知道遇到哪一种终端机时, 须送什麽字元才能移动游标的位置, 送什麽字元才能清除整个萤幕清除. (* 注一)

另外, 本文的介绍 以 System V 的 curses 版本为主.

 

2. 如何在您的程式使用 curses:

在您的 C 程式的档头将
include 进来.当您引进 curses.h 这个函式库後, 系统会自动



一并 include 进来.

另外, 在 System V 版本中,

这个函式库也将一并include进来
.

#include

main()

{

: :

: :

}

 

3. 如何编译(compile):

当您编辑好您的程式, 在 UNIX 提示符号下键入:

gcc [file.c] -lcurses

gcc [file.c] -lcurses -ltermlib(*注二)

 

4. 如何开始我的第一个 curses 程式:

在开始使用 curses 的一切命令之前, 您必须先利用 initscr()这个函式来开启 curses 模式.

相对的, 在结束 curses 模式前 ( 通常在您结束程式前 ) 也必须以endwin()来关闭 curses 模式.

Linux curses库使用#include 


Linux curses库使用
Linux curses库使用main()
Linux curses库使用 {

Linux curses库使用    initscr();
Linux curses库使用    : :
Linux curses库使用    : : 
Linux curses库使用    : :
Linux curses库使用    endwin();
Linux curses库使用}





 
Linux curses库使用
Linux curses库使用





这是一般 curses 程式标准的模式.

此外, 您可以就您程式所须, 而做不同的设定. 当然, 您可以不做设定,而只是呼叫 initscr(). 您可以自己写一个函式来存放所有您所须要的设定. 平常使用时, 只要呼叫这个函式即可启动 curses 并完成一切设定. 下面的例子, 即是笔者将平常较常用的一些设定放在一个叫 initial()的函式内.

Linux curses库使用 void initial()
Linux curses库使用 {

Linux curses库使用    initscr();
Linux curses库使用    cbreak();
Linux curses库使用    nonl();
Linux curses库使用    noecho();
Linux curses库使用    intrflush(stdscr,FALSE);
Linux curses库使用    keypad(stdscr,TRUE);
Linux curses库使用    refresh();
Linux curses库使用}








Linux curses库使用
Linux curses库使用


 各函式分别介绍如下:

  • initscr(): initscr() 是一般 curses 程式必须先呼叫的函数, 一但这个函数被呼叫之後, 系统将根据终端机的形态并启动 curses 模式.
  • endwin(): curses 通常以呼叫 endwin() 来结束程式. endwin() 可用来关闭curses 模式, 或是暂时的跳离 curses 模式. 如果您在程式中须要call shell ( 如呼叫 system() 函式 ) 或是需要做 system call, 就必须先以 endwin() 暂时跳离 curses 模式. 最後再以wrefresh() doupdate() 来重返 curses 模式.
  • cbreak() and nocbreak(): 当 cbreak 模式被开启後, 除了 DELETE 或 CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取.当处於 nocbreak 模式时, 从键盘输入的字元将被储存在 buffer 里直到输入 RETURN或 NEWLINE.在较旧版的 curses 须呼叫 crmode(),nocrmode() 来取代 cbreak(),nocbreak() 
  • nl() and nonl(): 用来决定当输入资料时, 按下 RETURN 键是否被对应为 NEWLINE 字元 ( 如 /n ). 而输出资料时, NEWLINE 字元是否被对应为 RETURN 和 LINDFEED系统预设是开启的.
  • echo() and noecho(): 此函式用来控制从键盘输入字元时是否将字元显示在终端机上.系统预设是开启的.
  • intrflush(win,bf): 呼叫 intrflush 时须传入两个值, win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr. bf 为 TRUE 或 FALSE. 当 bf 为 true 时, 当输入中断字元 ( 如 break) 时, 中断的反应将较为快速.但可能会造成萤幕的错乱. 
  • keypad(win,bf): 呼叫 keypad 时须传入两个值, win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr. bf 为 TRUE 或 FALSE. 当开启 keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右>等方向键, curses 会将这些特殊字元转换成 curses.h 内定义的一些特殊键. 这些定义的特殊键通常以 KEY_ 开头.
  • refresh(): refresh() 为 curses 最常呼叫的一个函式. curses 为了使萤幕输出入达最佳化, 当您呼叫萤幕输出函式企图改变萤幕上的画面时, curses并不会立刻对萤幕做改变, 而是等到refresh() 呼叫後, 才将刚才所做的变动一次完成. 其馀的资料将维持不变. 以尽可能送最少的字元至萤幕上. 减少萤幕重绘的时间.如果是 initscr() 後第一次呼叫 refresh(), curses 将做清除萤幕的工作. 

 

5. 游标的控制:

  • move(y,x): 将游标移动至 x,y 的位置.
  • getyx(win,y,x): 得到目前游标的位置. (请注意! 是 y,x 而不是&y,&x )

 

6. 有关清除萤幕的函式:

clear() and erase(): 将整个萤幕清除. (请注意配合refresh() 使用)

 

7. 如何在萤幕上显示字元:

  • echochar(ch): 显示某个字元.
  • addch(ch): 显示某个字元.
  • mvaddch(y,x,ch): 在(x,y) 上显示某个字元. 相当於呼叫move(y,x);addch(ch);
  • addstr(str): 显示一串字串.
  • mvaddstr(y,x,str): 在(x,y) 上显示一串字串. 相当於呼叫move(y,x);addstr(str);
  • printw(format,str): 类似 printf() , 以一定的格式输出至萤幕.
  • mvprintw(y,x,format,str): 在(x,y) 位置上做 printw 的工作. 相当於呼叫move(y,x);printw(format,str);

 

8. 如何从键盘上读取字元:

  • getch(): 从键盘读取一个字元. (注意! 传回的是整数值)
  • getstr(): 从键盘读取一串字元.
  • scanw(format,&arg1,&arg2…): 如同 scanf, 从键盘读取一串字元.

例:

Linux curses库使用 int ch;
Linux curses库使用 char string1[80];  /* 请注意! 不可宣告为 char *string1; */
Linux curses库使用 char string2[80];
Linux curses库使用echo();  /* 开启 echo 模式, 使输入立刻显示在萤幕上 */
Linux curses库使用ch=getch();
Linux curses库使用string1=getstr();
Linux curses库使用scanw(“%s”,string2);
Linux curses库使用mvprintw(10,10,”String1=%s”,string1);
Linux curses库使用mvprintw(11,10,”String2=%s”,string2);







 

 9. 如何利用方向键:

    curses 将一些如方向键等特殊控制字元, 以 KEY_ 为开头定义在 curses.h这个档案里头.

    如 KEY_UP 即代表方向键的 ” ↑ “. 但, 如果您想使用curses.h 所为您定义的这些特殊键的话, 您就必须将 keypad 设定为TRUE. 否则, 您就必须自己为所有的特殊键定义了. curses.h 为一些特殊键的定义如下:

  • KEY_UP 0403 ↑
  • KEY_DOWN 0402 ↓
  • KEY_LEFT 0404 ←
  • KEY_RIGHT 0405 →
  • KEY_HOME 0406 Home key (upward+left arrow)
  • KEY_BACKSPACE 0407 backspace (unreliable)
  • KEY_F0 0410 Function keys.
  • KEY_F(n) (KEY_F0+(n)) formula for f .
  • KEY_NPAGE 0522 Next page
  • KEY_PPAGE 0523 Previous page

以上仅列出笔者较常使用的一些控制键, 至於其他控制键的定义, 请自行参阅 man curses (* 注三).

一并为您列出其他常用的一些特殊字元:

  • [TAB] /t
  • [ENTER] /r
  • [ESC] 27
  • [BACKSPACE] 127

  

10. 如何改变萤幕显示字元的属性:

    为了使输出的萤幕画面更为生动美丽, 我们常须要在萤幕上做一些如反白, 闪烁等变化. curses 定义了一些特殊的属性, 透过这些定义, 我们也可以在 curses 程式控制萤幕的输出变化.

  • attron(mod): 开启属性.
  • attroff(mod): 关闭属性.

curses.h 里头定义了一些属性, 如:

  • A_UNDERLINE: 加底线.
  • A_REVERSE: 反白.
  • A_BLINK: 闪烁.
  • A_BOLD: 高亮度.
  • A_NORMAL: 标准模式(只能配合 attrset() 使用)

    当使用 attron() 开启某一种特殊属性模式後, 接下来在萤幕的输出都会以该种属性出现. 直到您呼叫 attroff() 将此模式关闭. 请注意, 当您欲 attron() 开启另一种属性时, 请记得利用attroff()先关闭原来的属性, 或直接以attrset(A_NORMAL) 将所有特殊属性关闭.否则, curses 会将两种属性做重叠处理.

例:

attrset(A_NORMAL); /* 先将属性设定为正常模式 */

attron(A_UNDERLINE); /* 加底线 */

mvaddstr(9,10,”加底线”); /* 加底线输出一串字元 */

attroff(A_UNDERLINE); /* 关闭加底线模式, 恢复正常模式 */

attron(A_REVERSE); /* 开启反白模式 */

mvaddstr(10,10,”反白”); /* 输出一串反白字元 */

attroff(A_REVERSE); /* 关闭反白模式, 恢复正常模式 */

attron(A_BLINK); /* 开启闪烁模式 */

mvaddstr(11,10,”闪烁”); /* 输出一串闪烁字元 */

attroff(A_BLINK); /* 关闭闪烁模式, 恢复正常模式 */

attron(A_BOLD); /* 开启高亮度模式 */

mvaddstr(12,10,”高亮度”); /* 输出一串高亮度字元 */

attroff(A_BOLD); /* 关闭高亮度模式, 恢复正常模式 */

 

11. 其他一些函数:

  • beep(): 发出一声哔声.
  • box(win,ch1,ch2): 自动画方框.
    • ch1: 画方框时垂直方向所用字元.
    • ch2: 画方框时水平方向所用字元.
    • example: box(stdscr,’|’,’-‘); 将以 | 及 – 围成一个方框.

  

12. 应用完整例:

    下面所举的例子, 即完全利用刚刚所介绍的含式来完成.这个程式可将从键盘上读取的字元显示在萤幕上, 并且可以上下左右方向键来控制游标的位置, 当按下 [ESC] 後, 程式即结束. 您有没有发现, 这不就是一个简单全萤幕编辑器的雏形吗?

实例1:

#include


#include


#define StartX 1
#define StartY 1
void initial();
main()
{

   int x = StartX;
   int y = StartY;
   int ch;
   initial();
   box(stdscr,’|’,’-‘);
   attron(A_REVERSE);
   mvaddstr(0,20,”curses program”);
   attroff(A_REVERSE);
   move(x,y);
   do{

      ch = getch();
      switch(ch)
      {

        case KEY_UP:
           –y;
           break;
            case KEY_DOWN: 
                ++y; 
                break;
            case KEY_RIGHT: 
                ++x; 
                break;
            case KEY_LEFT: 
                –x; 
                break;
            case ‘ ‘: 
                ++y;
                x=0;
                break;
            case ‘/t’: 
                x+=7;
                break;
            case KEY_BACKSPACE: 
                mvaddch(y,–x,’ ‘);
                break;
            case 27: 
                endwin(); 
                exit(1); 
            default: 
                addch(ch); 
                x++;
               break;
      }
      move(y,x);
   }while(1);
}





















































 

实例2:

#include

curses库函数说明  

C
cu
curs
curs_
curs_s
curs_se
curs_set
curs_set
C
CE
CE
C
cr
CRE
crea
creat
s
se
set
sett
set
sett
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221897.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午5:02
下一篇 2026年3月17日 下午5:02


相关推荐

  • SoftReference软引用

    SoftReference软引用示例代码 importjava lang ref SoftReferenc authorchenjc since2020 01 13 publicclassS 使用 JVM 参数 Xmx10m 运行程序 paramargs throwsI

    2026年3月17日
    2
  • ostringstream用法

    ostringstream用法使用MFC都知道他有一个非常方便的字符串类CString,C++标准也有一个string类,但是处理起来不够灵活,特别是没有类似Format()的函数。 无意中看到ostringstream的用法,使用它可以达到类似的效果。 ostringstreamos;stringstr=”abcef”;inti=1000;osstd::coutos.st

    2022年6月28日
    57
  • 字节跳动豆包大模型 2.0 发布:专家模式上线,多数基准达 SOTA 水平

    字节跳动豆包大模型 2.0 发布:专家模式上线,多数基准达 SOTA 水平

    2026年3月12日
    2
  • 树莓派3B+使用GPIO实现串口通信[通俗易懂]

    树莓派3B+使用GPIO实现串口通信[通俗易懂]https://www.circuits.dk/setup-raspberry-pi-3-gpio-uart/

    2022年6月25日
    55
  • cs架构的软件中服务器作用,cs架构(cs架构基本原理)

    cs架构的软件中服务器作用,cs架构(cs架构基本原理)用最简单的话,让我明白区别就给分。不要复制的!CS架构,就是你的电脑,需要装个软件,才能连接服务器。而BS架构,就是你的电脑,只需要用浏览器,就可以连接服务器了。1.CS(Client/Server):客户端—-服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据.软件中的CS架构指什么?C/S=Client/Server…

    2022年6月16日
    68
  • SyntaxHighlighter代码高亮插件

    SyntaxHighlighter代码高亮插件SyntaxHighli 是 GoogleCode 上的一个开源项目 主要用于给网页上的代码着色 使用十分方便 效果也不错 而且几乎支持常见的所有语言 使用步骤 一 下载并解压缩 SyntaxHighli xxx 当前版本 3 0 83 二 引入文件将解压后的 scripts 和 styles 文件夹复制到项目中 在页面中引入 shCore js 和核心 CSS 文件 shCore css 其次引入你要高亮

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号