2012-10-16 74 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