[Linux]從控制台一次讀取一個字元,無需等待斷行符號鍵
周銀輝
讀取字元嘛,可以使用getchar(),getch()等等函數,但它們都需要等待斷行符號鍵以結束輸入,而不是按下鍵盤時立即響應,看上去不那麼“即時”。
如果是在windows平台下的話,可以使用conio.h下的_getch()函數,注意是以底線開頭的,msdn連結在這裡。
在linux下貌似沒有找到類似的函數... 不過可以使用一個比較BT的方式來實現:更改控制台設定。
#include <termios.h>
static struct termios oldt;
//restore terminal settings
void restore_terminal_settings(void)
{
// Apply saved settings
tcsetattr(0, TCSANOW, &oldt);
}
//make terminal read 1 char at a time
void disable_terminal_return(void)
{
struct termios newt;
//save terminal settings
tcgetattr(0, &oldt);
//init new settings
newt = oldt;
//change settings
newt.c_lflag &= ~(ICANON | ECHO);
//apply settings
tcsetattr(0, TCSANOW, &newt);
//make sure settings will be restored when program ends
atexit(restore_terminal_settings);
}
下面是一個demo程式,複製粘貼試用吧:
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
static struct termios oldt;
//restore terminal settings
void restore_terminal_settings(void)
{
//Apply saved settings
tcsetattr(0, TCSANOW, &oldt);
}
//make terminal read 1 char at a time
void disable_terminal_return(void)
{
struct termios newt;
//save terminal settings
tcgetattr(0, &oldt);
//init new settings
newt = oldt;
//change settings
newt.c_lflag &= ~(ICANON | ECHO);
//apply settings
tcsetattr(0, TCSANOW, &newt);
//make sure settings will be restored when program ends
atexit(restore_terminal_settings);
}
int main()
{
int ch;
disable_terminal_return();
printf("press your keyboard\n");
/* Key reading loop */
while (1) {
ch = getchar();
if (ch == 'Q') return 0; /* Press 'Q' to quit program */
printf("\tYou pressed %c\n", ch);
}
return 0;
}