ncurses輸出函式:字元+字串的輸出

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

輸出函式

在curses 函式中有三類輸出函式,它們分別是:

  • addch()系列:將單一的字元列印到螢幕上,可以附加加字元修飾引數的一類函式。
  • printw()系列:和printf()一樣的具有格式化輸出的一類函式。
  • addstr()系列:列印字串的一類函式。

這幾類函式可以交替使用。關鍵是要了解各類函式的具體應用環境。讓我們來看看這些函式。

addch()系列函式

addch()函式用於在當前游標位置輸入單個字元,並將游標右移一位。你可以使用這個函式輸出一個字元,並給其新增修飾。在後面的章節中我們將會對其做出詳細的介紹。如果一個字元關聯有修飾效果(比如:粗體、反色等等),那麼當curses 輸出這個字元的同時就會應用相關的修飾。

給單個字元關聯屬性有兩種方法:使用修飾巨集(通過“或”運算子)修飾。這些修飾巨集可以在標頭檔案ncurses.h 中找到。比如,你想輸出一個具有加粗(BOLD)加下劃線(UNDERLINE)效果的字元變數ch,可以使用下面這種方法:

addch(ch | A_BOLD | A_UNDERLINE);

使用attrset()attron()attroff()修飾函式。簡而言之,它們將當前的修飾關聯於給定的視窗。一旦設定完成,則在相應視窗中輸出的字元都會被修飾,直到關閉視窗。這些函式將在文字修飾一章介紹。另外,curses 提供了一些可以在字元模式下作簡單圖形的特殊字元。你可以用它們繪製表格、水平、垂直線條等等,這些特殊字元都是以ACS_作為開頭宣告的巨集並儲存在標頭檔案ncurses.h 裡。

mvaddch()waddch() 和mvwaddch()函式

mvaddch()用於將游標移動到指定位置輸出字元。因而,下面的函式呼叫:

move(row,col); /*將游標移動到row 所指定的行和col 所指定的列。*/
addch(ch);

可以用以下的等價函式取代:

mvaddch(row,col,ch);

waddch()函式和addch()函式類似。不同的是,waddch()函式是將字元輸出到指定視窗的指定座標處。(注:addch()將字元輸出到標準輸出stdscr 上。) 同樣的mvwaddch()函式是把游標移動到指定視窗中的指定位置處輸出字元。 現在,我們熟悉了一些基本的輸出函式。但是,如果我們要輸出字串,像這樣一個一個的輸出字元是很煩人的。幸好,ncurses 為我們提供了像printf()puts()一樣方便的函式。

printw()系列函式

這些函式的用法和我們熟悉的printf()函式相似,但增加了可以在螢幕任意位置輸出的功能。

printw()函式和mvprintw()函式

這兩個函式的絕大部分用法和printf()函式相同。mvprintw()函式將游標移動到指定的位置,然後列印內容。如果你想先移動游標,再呼叫printw()函式,也就是說先呼叫move()函式,然後呼叫printw()函式。我不知道為什麼有些人非要使用這兩個函式代替一個函式,當然決定權在你手裡。

wprintw() 函式和mvwprintw 函式

這兩個函式和以上兩個函式類似。區別在於這兩個函式將在指定的視窗輸出內容,而以上兩個函式將內容輸出到標準輸出stdscr 上。

vwprintw()函式

這個函式和vprintf()相似,用於列印變數表中所對應的變數。

一個簡單的printw()函式的使用例子

  • 例:一個簡單的printw()函式的使用例子:
/*
Compile: gcc main.c -lncurses
*/
#include <ncurses.h>                    /* ncurses.h 已經包含了stdio.h */
#include <string.h>
int main()
{
    char mesg[]="Just a string";        /* 將要被列印的字串*/
    int row,col;                        /* 儲存行號和列號的變數,用於指定游標位置*/
    initscr();                          /* 進入curses 模式*/
    getmaxyx(stdscr,row,col);           /* 取得stdscr(標準輸出裝置)的行數和列數*/
    mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);
                                        /*在螢幕的正中列印字串mesg*/
    mvprintw(row/2,0,"This screen has %d rows and %d columns\n",row,col);
    printw("Try resizing your window(if possible)and then run this program again");
    refresh();
    getch();
    endwin();
    return 0;
}

上面這個程式展示了使用printw()系列函式輸出字元是多麼簡單。你只需要修改要輸出的行列座標和要列印的資訊,它就會按你的需要輸出。這個程式引入了一個新函式getmaxyx(),這是一個定義在ncurses.h 中的巨集,可以給出指定視窗的行列數目。getmaxyx()是通過修改所給變數實現這一功能的。getmaxyx()不是一個函式,因此不能以指標作為引數,只能通過兩個整型變數來實現。

addstr()系列函式

addstr()函式用於在指定視窗輸出字串,如同連續使用addch()函式來輸出指定字串中的每個字元。實際上,也就是所有addstr()系列輸出函式的事實。addstr()系列函式還包括mvaddstr()mvwaddstr()waddstr(),它們有著相同的curses 命名規則和呼叫方法(如mvaddstr() 函式就是分別呼叫了move()addstr()函式)。這個函式集中,還有一個特殊函式addnstr(),它需要一個整型引數n,用來列印字串中的前n 個字元。如果這個引數是負數,addnstr()將會列印整個字串。

提醒

所有這些函式中使用座標時,先給定y 座標,再給定x 座標,也就是先行後列。因為計算機字元模式是逐行顯示的。很多初學者因為數學上的使用習慣,而錯誤的先x 後y。如果你進行了過多行列座標的操作,想想看將螢幕分割成幾個不同的視窗,然後獨立處理每一個單獨視窗的情形。

相關文章