本系列文章系本人原创,欢迎转载,转载请注明出处
注:这篇文章所建立的所有文件(源文件,库文件,可执行文件等)均可在这里下载。下载的是chapter5.tar.gz文件,可以在Linux系统终端中用如下命令解压到当前目录:
tar zxvf chapter5.tar.gz
在Linux系统下,你可能会与终端(命令行)有很多的交互,因此,编写能够控制终端的程序也是值的探讨的。现在我们就来讲解一下Linux下控制终端的函数库curses。
一、用curses函数库在终端打印 “Hello World!”
用Hello World来作为一个语言的学习过程中的第一个程序几乎已成为一种惯例。同样的,我们用curses函数库做的第一件事,也是打印Hello World。
在此之前,因为我们操作的是终端(屏幕),所以我们先来简单的介绍下字符是如何显示在屏幕上的。
首先,curses函数库有两个数据结构来对应终端屏幕:stdscr和curscr。stdscr是curses的默认输出屏幕,curscr对应的是当前屏幕,在程序调用refresh函数之前,输出到stdscr上的内容是不会显示出来的。而refresh函数的功能就是比较stdscr和curscr的不同,然后根据结果来刷新屏幕。
既然是要将内容输出到屏幕上,那么我们就要知道内容输出到屏幕上的什么位置。在curses函数库中,用形如(行,列)的方式来表示屏幕上的位置,如 (5,2)就表示第五行第二列。坐标原点 (0,0)在终端屏幕的左上角。
好了,接下来我们就开始第一个用curses函数库在屏幕上输出的例子吧,源码如下:
#include <curses.h>
int main()
{
//在进行屏幕的操作前需要先初始化
initscr();
//移到第二行,第五列
move(2, 5);
//在当前位置输出字符串
printw("%s","Hello World!");
//refresh的作用我们在上面讲过
refresh();
//停顿3秒
sleep(3);
//我们的屏幕操作结束了
endwin();
return 0;
}
回到终端,编译源码。由于curses函数库不是C语言标准库,在编译的时候需要指定库文件:
gcc helloWorld.c -lcurses
编译无误后,执行文件,效果如图,会在指定的位置输出 “Hello World!”,停顿3秒,然后程序退出。
二、一些关于终端屏幕的基本操作
光标的移动
这个比较简单,我们呢在上面的 “Hello World”的例子里已经见到过:
#include <curses.h>
int move(int row, int column);
执行该函数,将光标移动到到指定的(行,列)。这里再介绍两个值LINES和COLS,它们分别对应row和column能指定的最大值。
键盘相关的操作
1) 控制模式
#include <curses.h>
//开启回显
int echo(void);
//关闭回显