我在整个互联网寻找一些函数,将从键盘读取一个键,而不必等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