首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Curses庫編程指南(二):I/O處理 - 輸入輸出函數詳解

     編輯:關於C語言

2.3 輸入/輸出函數完整參考

2.3.1 字符與字符串輸出函數

函數原型功能說明關鍵特性
int addch(chtype ch)在光標位置輸出字符,不自動刷新需配合 refresh() 顯示
int echochar(chtype ch)輸出字符並自動刷新窗口等價 addch() + refresh()
int addstr(char* str)輸出字符串,超出屏幕寬度截斷不換行,光標移至字符串末尾
int printw(char* fmt, ...)格式化輸出(類 printf)支持 %d %s %c %f 等格式符
int insch(chtype ch)在光標位置插入字符,右側字符右移最右字符超出屏幕則丟失
int delch()刪除光標處字符,右側字符左移
int insertln()在光標行插入空行,當前行及以下下移最後一行丟失
int deleteln()刪除光標行,下方所有行上移,最後一行填空格

窗口相關變體:所有函數均有 w 前綴(指定窗口)、mv 前綴(移動光標)、mvw 組合前綴版本,如 waddch(win, ch)、mvaddstr(y, x, str)、mvwprintw(win, y, x, fmt, ...)。

chtype 類型詳解

  • 定義:typedef unsigned long chtype;
  • 低位存儲字符碼,高位存儲屬性位(顏色、粗體、下劃線等)
  • 可用 | 組合字符與屬性:addch('A' | A_BOLD | COLOR_PAIR(1))

ACS_ 繪圖字符常量

ACS_ULCORNER  ┌  ACS_URCORNER  ┐  ACS_LLCORNER  └  ACS_LRCORNER  ┘
ACS_HLINE     ─  ACS_VLINE     │  ACS_PLUS     ┼
ACS_TTEE      ┬  ACS_BTEE      ┴  ACS_LTEE     ├  ACS_RTEE     ┤
ACS_DIAMOND   ◆  ACS_CKBOARD   :  ACS_DEGREE   °  ACS_PLMINUS  ±
ACS_BULLET    ●  ACS_LARROW    ←  ACS_RARROW   →  ACS_UARROW   ↑
ACS_DARROW    ↓  ACS_BLOCK     █  ACS_LANTERN  #  ACS_BOARD    #

2.3.2 字符與字符串輸入函數

函數原型功能說明返回值
int getch()讀取一個字符(無回顯),返回字符整數值成功:字符碼;失敗:ERR
int getstr(char* str)讀取字符串(以換行結束),存入 str,\n 轉為空格成功:OK;失敗:ERR
int scanw(char* fmt, ...)格式化輸入(類 scanf),從當前光標位置讀取成功賦值的項目數

窗口變體:wgetch(win)、wgetstr(win, str)、wscanw(win, fmt, ...)、mvgetch(y, x) 等。

輸入模式控制

  • cbreak():字符緩衝模式,無需回車即可讀取,Ctrl+C 仍產生信號
  • nocbreak():行緩衝模式(默認),需回車確認
  • echo()/noecho():控制輸入字符是否回顯
  • keypad(win, TRUE):啟用功能鍵(方向鍵、F1-F12 等返回 KEY_* 常量)
  • nodelay(win, TRUE):非阻塞模式,無輸入時 getch() 立即返回 ERR
  • halfdelay(tenths):帶超時的阻塞,tenths 為十分之一秒

完整示例:簡易文本編輯器原型

#include <curses.h>

int main() {
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);
    
    int y = 0, x = 0;
    move(y, x);
    
    int ch;
    while ((ch = getch()) != 'q') {  // 'q' 退出
        switch (ch) {
            case KEY_UP:    if (y > 0) y--; break;
            case KEY_DOWN:  y++; break;
            case KEY_LEFT:  if (x > 0) x--; break;
            case KEY_RIGHT: x++; break;
            case KEY_BACKSPACE:
            case 127:       // Backspace
                if (x > 0) { x--; delch(); }
                break;
            case '\n':      // Enter
                y++; x = 0; break;
            default:
                if (ch >= 32 && ch <= 126) {  // 可打印字符
                    insch(ch);
                    x++;
                }
        }
        move(y, x);
    }
    
    endwin();
    return 0;
}

關鍵點總結

  1. 輸出不自動刷新:默認需顯式調用 refresh() 或 wrefresh(win),或使用 echochar() 系列
  2. 輸入模式決定交互體驗:cbreak() + noecho() + keypad() 是遊戲/編輯器標準配置
  3. chtype 攜帶屬性:輸出時組合屬性,實現彩色、高亮、繪圖字符
  4. 窗口變體靈活控制:w/mv/mvw 前綴組合,精確控制位置與窗口
  5. 非阻塞/超時輸入:nodelay()/halfdelay() 實現動畫、實時更新等場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved