我在整個互聯網尋找一些函數,將從鍵盤讀取一個鍵,而不必等LF(如conio.h中的getch())。不幸的是,我必須用gcc使用開關-ansi和-pedantic進行編譯,這使得getch()對我無用。也許你知道一些符合標準的其他功能?函數讀取一個密鑰,而無需等待LF
回答
您可以使用標準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;
}
Nah,不幸的是它不能滿足我。我仍然需要擊中_enter_鍵(發送LF字符)才能使程序更進一步。這是不可能的?我傷心。然後我想知道是否有任何方法(使用這些編譯設置)來編寫一種遊戲(如蛇),其中程序立即響應按鍵... – Sushi271
我不認爲它;)但使用純C它只是不可能。你將需要使用一些操作系統特定的功能來將終端置於原始模式(請參閱'man termios' for POSIX),或者更好的是一個爲你做這件事的庫,例如[ncurses](http:// www。 gnu.org/software/ncurses/) –
好的,我已經在這方面做了很多工作;我發現了termios結構的完整規範 - 即使在我的語言中:) - 還有一些標誌我必須關閉(ECHO&ICANON)。並感謝「編輯」以及。請告訴我多一個,略有不同但很少的東西(儘管我認爲這很容易):如果某些字符在輸入緩衝區中等待(或其中多少),我該如何知道? – Sushi271
- 1. 如何閱讀密鑰而無需等待它,程序集8086
- 2. 函數無需等待前一個完成而運行
- 3. 在從JTextField讀取數據之前等待密鑰
- 4. AES密鑰中有一個LF字符
- 5. 如何讀取SwingWorker的結果*而無需等待?
- 6. 等待多個信號而無需等待(C/C++ Linux)
- 7. 無法讀取密鑰?
- 8. 函數調用另一個無需等待完成
- 9. 多次調用函數而無需等待它完成
- 10. 呼籲,而無需等待響應
- 11. 量角器移動到下一個測試,而無需等待
- 12. 的recv()閱讀()和send(),而無需等待
- 13. PHP:mysql_query無需等待
- 14. 獲取下一個功能,而無需等待永恆的循環
- 15. OpenCV:等待不同的密鑰?
- 16. Redis/Node等待密鑰存在
- 17. 創建讀取單個密鑰的vim函數
- 18. 如何提交一個函數並繼續執行下一個步驟而無需等待此功能完成?
- 19. 無需等待讀取STDOUT和STDERR的外部命令
- 20. 獲取過去的請求而無需等待回覆(Angular 2 +)
- 21. 無法從KeyStore讀取密鑰
- 22. 無法讀取註冊表密鑰
- 23. spring-security-kerberos無法讀取密鑰表?
- 24. 獲取無數組密鑰
- 25. 等待一個函數來完成
- 26. 等待一個函數的響應Extjs
- 27. jquery:等待一個函數來完成
- 28. 讀/提取數據,而無需恢復
- 29. getURL卡住,需要等待函數
- 30. 獲取一個無法等待無效,在我想要等待的方法上
不'getchar'不是你所需要的? –
有沒有便攜的方式來做到這一點。爲每個操作系統製作自己的「便攜式」包裝。 – Mehrdad
當我使用'getchar()'編寫簡單的程序時,它仍然等待LF。爲什麼這很難?從緩衝區取出一個字符很難嗎?在LF字符之後採取所有這些更困難? – Sushi271