2012-10-16 26 views
2

我在整個互聯網尋找一些函數,將從鍵盤讀取一個鍵,而不必等LF(如conio.h中的getch())。不幸的是,我必須用gcc使用開關-ansi和-pedantic進行編譯,這使得getch()對我無用。也許你知道一些符合標準的其他功能?函數讀取一個密鑰,而無需等待LF

+0

不'getchar'不是你所需要的? –

+1

有沒有便攜的方式來做到這一點。爲每個操作系統製作自己的「便攜式」包裝。 – Mehrdad

+0

當我使用'getchar()'編寫簡單的程序時,它仍然等待LF。爲什麼這很難?從緩衝區取出一個字符很難嗎?在LF字符之後採取所有這些更困難? – Sushi271

回答

2

您可以使用標準setvbuf函數來禁用緩衝(請參閱下面的示例)。請注意,這會導致從程序的角度禁用緩衝,但不會禁用終端中的緩衝(這可能也是您想要的)。示例代碼:

#include <stdio.h> 

int main() 
{ 
     char c; 
     setvbuf(stdin, 0, _IONBF, 0); 
     c = getc(stdin); 
     printf("read %c\n", c); 

     return 0; 
} 

這樣運行它仍然會從終端線逐讀取輸入,但僅消耗的第一個字符輸入:

$ ./buf 
ab 
read a 
$ b 

卸下setvbuf線將導致輸入的整行被你的程序使用。

如果僅使用C標準庫,沒有便攜式的方法來禁用終端的行緩衝,因爲它不知道終端。

編輯:這樣做的

一個POSIX便攜方式,你想要的是使用termios的功能:

#include <stdio.h> 
#include <unistd.h> /* for STDIN_FILENO */ 
#include <termios.h> 

int main() 
{ 
     char c; 
     struct termios old, t; 

     tcgetattr(STDIN_FILENO, &old); 
     t = old; 
     cfmakeraw(&t); 
     tcsetattr(STDIN_FILENO, TCSANOW, &t); 
     c = getc(stdin); 
     tcsetattr(STDIN_FILENO, TCSANOW, &old); 
     printf("\rread %c\n", c); 

     return 0; 
} 
+0

Nah,不幸的是它不能滿足我。我仍然需要擊中_enter_鍵(發送LF字符)才能使程序更進一步。這是不可能的?我傷心。然後我想知道是否有任何方法(使用這些編譯設置)來編寫一種遊戲(如蛇),其中程序立即響應按鍵... – Sushi271

+0

我不認爲它;)但使用純C它只是不可能。你將需要使用一些操作系統特定的功能來將終端置於原始模式(請參閱'man termios' for POSIX),或者更好的是一個爲你做這件事的庫,例如[ncurses](http:// www。 gnu.org/software/ncurses/) –

+0

好的,我已經在這方面做了很多工作;我發現了termios結構的完整規範 - 即使在我的語言中:) - 還有一些標誌我必須關閉(ECHO&ICANON)。並感謝「編輯」以及。請告訴我多一個,略有不同但很少的東西(儘管我認爲這很容易):如果某些字符在輸入緩衝區中等待(或其中多少),我該如何知道? – Sushi271