用curses輸出HelloWorld(curses筆記一)
阿新 • • 發佈:2018-12-13
用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的內容了…這僅僅為了讓程式慢一點退出方便我截個圖…