第一個ncurses程式: hello world !!!

Koma_Wong發表於2018-06-20
  • Copyright(C) NCURSES Programming HOWTO

第一個ncurses hello world 程式

#include <ncurses.h> 
/*
Compile: gcc main.c -lncurses
*/ 
int main()  
{  
    initscr();                 /* 初始化,進入NCURSES 模式*/  
    printw("Hello World !!!"); /* 在虛擬螢幕上列印Hello, World!!! */  
    refresh();                 /* 將虛擬螢幕上的內容寫到顯示器上,並重新整理*/  
    getchar();                 /* 等待使用者輸入*/  
    endwin();                  /* 退出NCURSES 模式*/  
    return 0;  
} 

這個程式在顯示器螢幕上列印“Hello World !!!”後等待使用者按任意鍵退出。這個小程式展示瞭如何初始化並進入curses 模式、處理螢幕和退出curses 模式。讓我們逐行的分析這個小程式:

關於initscr() 函式

initscr()函式將終端螢幕初始化為curses 模式。它用來清除螢幕上所有的字元,並等待下一部處理。所以在呼叫其它的curses 函式前,要先呼叫initscr()函式初始化螢幕。這個函式初始化了curses 系統並且為當前螢幕(也就是“stdscr”)和相關的資料結構分配記憶體。在以前的計算機上曾經出現過一個極端的例子:因為系統中的可用記憶體太小,以至於initscr()函式無法分配足夠的記憶體給相關的資料結構,從而導致curses 系統初始化失敗。

神祕的refresh()函式

第二行的printw()函式用於把字串“Hello,World!!!”輸出到虛擬的螢幕上。這個函式在用法上和printf()函式很像。不同的是:printw()函式把字串輸出到“stdscr”的虛擬視窗座標(0,0)上(從顯示的結果來看,座標(0,0)在螢幕的左上角上)。 現在該說說這個神祕的refresh()函式了。在我們使用printw 函式列印“Hello World!!!”時,實際上這個訊息列印到了一個叫作“stdscr”的虛擬視窗上,沒有被直接輸出到螢幕上。printw()函式的作用是不斷將一些顯示標記和相關的資料結構寫在虛擬顯示器上,並將這些資料寫入stdscr 的緩衝區內。為了顯示這些緩衝區中的資料我們必須使用refresh()函式告訴curses系統將緩衝區的內容輸出到螢幕上。 通過這種機制程式設計師能夠不斷在虛擬螢幕上寫資料。然後呼叫refresh()函式讓輸出的操作看起來是一次完成的。因為refresh()函式只核查視窗和資料中變動的部分,這種富有彈性的設計提供了一個高效的反饋機制。但是這有時很打擊初學者的積極性。因為對於初學者來說忘記在輸出後呼叫refresh()函式是很惱人的錯誤。不過不用擔心,很多人都會犯這樣的錯誤。

關於endwin()函式

最後,別忘了退出curses 模式。否則,在程式結束後你的終端可能會運轉得不正常。endwin()函式釋放了curses 子系統和相關資料結構佔用的記憶體,使你能夠正常返回控制檯模式。這個函式必須是在你完成所有的curses 操作以後才可以呼叫。(譯者注:如果你在endwin()函式後再呼叫其它的curses 的函式。很顯然,那些語句不會執行。)說到這裡,順便提醒一下。如果你的程式不能正常地顯示東西了。請務必看看initscr()函式和endwin()函式是不是在不該被呼叫的地方呼叫了。

相關文章