如何在Linux下自定義getchar行為

小樊
83
2024-09-06 21:33:09

在 Linux 下,您可以通過(guò)使用 termios 庫(kù)自定義 getchar() 函數(shù)的行為

#include<stdio.h>
#include <termios.h>
#include <unistd.h>

int my_getchar() {
    struct termios old_term, new_term;
    int ch;

    // 獲取當(dāng)前終端設(shè)置
    tcgetattr(STDIN_FILENO, &old_term);

    // 復(fù)制舊終端設(shè)置到新設(shè)置
    new_term = old_term;

    // 關(guān)閉回顯和規(guī)范模式
    new_term.c_lflag &= ~(ECHO | ICANON);

    // 應(yīng)用新終端設(shè)置
    tcsetattr(STDIN_FILENO, TCSANOW, &new_term);

    // 讀取一個(gè)字符
    ch = getchar();

    // 恢復(fù)舊的終端設(shè)置
    tcsetattr(STDIN_FILENO, TCSANOW, &old_term);

    return ch;
}

int main() {
    int ch;

    printf("Press any key to continue...\n");
    ch = my_getchar();
    printf("You pressed: %c\n", ch);

    return 0;
}

這個(gè)程序首先獲取當(dāng)前終端設(shè)置,然后創(chuàng)建一個(gè)新的設(shè)置,其中關(guān)閉了回顯和規(guī)范模式。接下來(lái),它將新設(shè)置應(yīng)用于終端,并使用 getchar() 讀取一個(gè)字符。最后,它恢復(fù)舊的終端設(shè)置。

這樣,當(dāng)您運(yùn)行此程序時(shí),它將立即響應(yīng)您的按鍵,而不是等待您按下 Enter 鍵。同時(shí),由于關(guān)閉了回顯,按鍵不會(huì)顯示在屏幕上。

0