curses 函数库提供了终端无关的方式来编写全屏幕的基于字符的程序。curses 还可以管理键盘,提供了一种简单易用的非阻塞字符输入模式。

curses 函数库能够优化光标的移动并最小化需要对屏幕进行的刷新,从而也减少了必须向字符终端发送的字符数目。

curses 函数库有多种不同的实现版本。Linux 使用的是 ncurses(new curses),可以使用 sudo apt-get install libncurses5-dev 安装。

在编译时使用 -lncurses 选项来链接 curses 函数库

gcc hello.c -lncurses
 1 #include <ncurses.h>
2
3 int main()
4 {
5 initscr();
6 move(5, 15);
7 printw("%s", "hello world");
8 refresh();
9 getch();
10 endwin();
11 return 0;
12 }

运行后显示如下:

curses 的概念

curses 例程工作在屏幕、窗口和子窗口上。所谓屏幕就是你正在写的设备(通常是终端屏幕,也可能是xterm屏幕)。屏幕占据了设备上全部的可用显示面积,当然,如果设备是X视窗中的一个终端窗口,则屏幕就是该终端窗口内所有可用的字符位置。无论何时,至少存在一个 curses 窗口,我们称之为 stdscr,它与物理屏幕的尺寸完全一样。你可以创建一些尺寸小于该屏幕的窗口,窗口可以互相重叠,它们还可以拥有自己的多个子窗口,但每个子窗口必须总是被包含在它的父窗口内。

curses 函数库用两个数据结构来映射终端屏幕,它们是 stdscr 和 curscr。两者中,stdscr 更重要,它会在 curses 函数产生输出时被刷新。stdscr 数据结构对应的是“标准屏幕”,是 curses 程序中默认输出窗口。curscr 数据结构和 stdscr 类似,但它对应的是当前屏幕的样子。在程序调用 refresh 函数之前,输出到 stdscr 上的内容不会显示在屏幕上。curses 函数库在调用 refresh 函数时比较 stdscr(屏幕将会是什么样子) 和 curscr(屏幕当前时什么样子)之间的不同之处,然后根据这个差异来刷新屏幕。

逻辑屏幕的布局通过一个字符数组来实现,它以屏幕的左上角——坐标(0,0)为起点,通过行号和列号来组织。所有的 curses 函数使用的坐标都是 y 值(行号)在前,x 值(列值)在后。

示例详解:

WINDOW *initscr(void);

initscr 函数将终端屏幕初始化为 curses 模式,它用来清除屏幕上所有的字符,并等待下一步处理。所以在调用其它的 curses 函数前,要先调用 initscr() 函数初始化屏幕。如果成功,返回一个指向 stdscr 结构的指针;如果失败,输出一条诊断错误信息并使程序退出。

int move(int new_y, int new_x);

move 函数用来把逻辑光标的位置移动到指定地点。

int printw(char* format, ...);

采用与 printf 函数相同的方法对字符串进行格式化,然后将其添加到光标的当前位置。

int refresh(void);

当使用 printw 函数打印时,字符串实际上是打印到 stdscr 的虚拟窗口上,没有直接输出到屏幕,而是在 stdscr 的缓冲区中。为了显示这些缓冲区中的数据,必须使用 refresh() 函数告诉 curses 系统将缓冲区的内容输出到屏幕。

int getch(void);

获取一个字符。

int endwin(void);

退出 curses 模式,释放 curses 子系统和相关数据结构占用的内存。

使用 curses 函数库管理基于文本的屏幕的更多相关文章

  1. curses库--libncurses5-dev--游标移动及屏幕的显示

    curses是一个在Linux/Unix下广泛应用的图形函数库.,作用是可以绘制在DOS下的用户界面和漂亮的图形. curses的名字起源于"cursor optimization" ...

  2. Linux学习笔记13——使用curses函数库

    一 安装curses库 如果你的Linux系统中curses库,直接敲入命令sudo apt-get install libncurses5-dev,然后就会自动安装curses库,安装好之后敲入命令 ...

  3. linux curses函数库

    fedora20,安装yum install ncurses-devel 编译时:-lncurses 头文件:#include<curses.h> 参考:man ncurses \linu ...

  4. 踩坑事件:不能对基于文本的临时表使用sql insert语句

    先来描述一下问题: 如果你是从基于文本的数据源来创建DataFrame的,当你将DataFrame注册为临时表后,如果对这个临时表进行insert into 操作,会抛出异常的. 问题答案参见:htt ...

  5. Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞

    漏洞名称: Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-067 发布时间: 2013-11-07 ...

  6. 基于文本图形(ncurses)的文本搜索工具 ncgrep

    背景 作为一个VIM党,日常工作开发中,会经常利用grep进行关键词搜索,以快速定位到文件.如图: 利用grep进行文本搜索 但是,这一过程会有两个效率问题: 展示的结果无法进行直接交互,需要手动粘贴 ...

  7. Android的so注入( inject)和函数Hook(基于got表) - 支持arm和x86

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53942648 前面深入学习了古河的Libinject注入Android进程,下面来 ...

  8. SetConsoleTextAttribute 函数--设置控制台文本属性

    SetConsoleTextAttribute函数 来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs. ...

  9. poj 2478 Farey Sequence(欧拉函数是基于寻求筛法素数)

    http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它主要的性质. 1.欧拉函数是求小于n且和n互质(包含1)的正整数的个数. 记为φ(n). 2. ...

随机推荐

  1. 使用C++编写linux多线程程序

    前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...

  2. JDK的安装及环境变量配置

    JDK的安装及环境变量配置 JDK解释:直达详细解释. 1.JDK下载地址:点击直达官网下载 进入后,如图1,点击图中红框DOWNLOAD按钮进入下载页 进入下载页后,在下载也底端,根据自己的需求下载 ...

  3. 解决:org.xml.sax.SAXParseException: 元素类型 "head" 必须由匹配的结束标记 "</head>问题

    事件背景: 今天就碰到了这样的问题, org.xml.sax.SAXParseException: 元素类型 "head" 必须由匹配的结束标记 "</head&g ...

  4. 新手-ios

    最近突然让我学习一下ios,之前从未接触过(一脸蒙逼).而且我用的电脑也不是ios操作系统.上网查了下 网友说虚拟机也可以,于是本人从此举用上了ios系统. 需要的安装的工具有: 资源共享给大家: h ...

  5. C# 封装微信的模板消息

    1.先新建一个类库,以方便以后移植到其他的项目上继续使用,如何新建类库就自己去百度了哈,这里就不描述了,若有不会的朋友请留言哈.标红了的都要注意下咯. 2.先看看WxTemplate这个类文件的代码 ...

  6. linux指定只显示(只打印)文件中的某几行(中间几行)

    [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1000 [二]显示1000行到3000行 cat ...

  7. swift 实践- 14 -- UIScrollView

    import UIKit class ViewController: UIViewController ,UIScrollViewDelegate{ override func viewDidLoad ...

  8. 不想用ssh框架

    学过三遍多的样子,没有感悟到特别多的好处. 现在工作都用,想找一个不用这个的工作就不好找.c的话,觉得没有Java面向对象提炼得好. 不是很明白怎么都用,知道自己不想用.里边太多复杂和要背下来的东西, ...

  9. 【JS】中ajax的URL中包含中文,后台接收乱码

    [问题]ajax提交get请求,url中参数包含中文,后台接收到显示乱码. [解决方案]前台: function getSiteInfoByName(siteName){ var res; $.aja ...

  10. python垃圾回收机制:引用计数 VS js垃圾回收机制:标记清除

    js垃圾回收机制:标记清除 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理 当变量进入环境时,将这个变量标记为"进入 ...