1. 程式人生 > >用curses輸出HelloWorld(curses筆記一)

用curses輸出HelloWorld(curses筆記一)

用curses輸出HelloWorld

  Linux/Unix程式設計往往都是在終端下進行的,但即使是基礎文字的程式設計依然能夠儘可能地實現很多圖形控制,像vi可以實現在終端中全屏的編輯器就是基於curses的一個具體實現。

  curses的名字起源於"cursor optimization",即游標優化。它最早由有美國伯克利大學的Bill Joy和Ken Arnold編寫的,用來處理一個遊戲rogue的螢幕顯示。後來貝爾實驗室的Mark Horton在System III Unix中重新編寫了curses。現在幾乎所有的Unix/Linux作業系統都帶了curses函式庫,curses也加入了對滑鼠的支援,一些選單和麵板的處理。

  以Ubuntu為例,安裝curses庫的命令列如下:

sudo apt-get install libncurses5-dev

事實上Linux中使用的很可能是ncurses(new curses)。

  基於curses的HelloWorld:

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>

int main(int argc, char **argv)
{
	initscr();
	
	move(5, 15);
	printw("%s", "Hello World");
	refresh
(); sleep(10); endwin(); exit(EXIT_SUCCESS); }

  需要注意的是 : 在編譯時要加上 -lcurses(其實這個不用說也知道,並沒什麼要注意的…)

cc curses1.c -o curses1 -lcurses

  執行結果:
在這裡插入圖片描述

  上述程式碼中,有幾句話是編寫基於curses程式必須有的:

	initscr(); //初始化螢幕,initialize screen
...
	endwin(); //curses的重置操作,即恢復終端之前的樣子
	exit(EXIT_SUCCESS); //這個不能算curses庫的東西了吧......

  而在初始化與重置操作之間的部分中,幾個函式的說明如下:

  • move函式用於移動游標。需要注意的是座標原點在左上角,y軸正方向向下,x軸正方向向右。最重要的是座標的表示法並不是(x, y)而是(y, x),其實可以理解為先寫第幾行再寫第幾列。具體如下圖:
    在這裡插入圖片描述
  • printw是基於curses的格式化列印函式,和printf的用法沒什麼不同。
  • 對於refresh函式需要知道邏輯螢幕和物理螢幕的區別。在curses中所謂的列印、顯示到螢幕都是對於邏輯螢幕而言的,真正的螢幕(物理螢幕)並沒有發生變化。僅當使用了refresh函式後,當前時刻邏輯螢幕上的內容就會替換掉當前時刻物理螢幕的內容。
  • 最後的sleep肯定不是curses的內容了…這僅僅為了讓程式慢一點退出方便我截個圖…