2011-03-02 120 views
0

我想立即从windows和linux下用c编写的控制台应用程序读取每个击键。不幸的是,当按下“输入/返回”键时,函数获得(行)只返回一个值。 我正在寻找一个在按下键后立即返回的函数。从控制台应用程序读取同步按键

目前我的代码看起来是这样的:

char cTmp[MAX_LINE]; 
char line[MAX_LINE]; 
while(gets(line) != NULL) { 
    sprintf(cTmp,"Characters entered: %c", line); 
    puts(cTmp); 
} 
+0

不确定,但不会getc()做到这一点? – 2011-03-02 06:49:00

回答

2

你可能寻找getch()。在Windows(至少VC++)中,它在<conio.h>中声明。在Linux上它是curses的一部分。

+0

其实getc()是stdio的一部分 – 2011-03-02 06:51:15

+1

@Murali VP:是的,getc是stdio的一部分 - 但它不会做他想做的事情(至少在我见过的任何实现中)。即使它只读取单个字符,它也要求用户在按下回车键之前按下回车键。 'getch'不*是* stdio的一部分,但它做他想做的事情 - 读取单个字符*而不*等待用户按回车。 – 2011-03-02 06:53:27

+1

@Murali VP getc()是一个流函数,因此除非终端被重新配置为非线性模式,否则不会具有所需的行为。 – 2011-03-02 06:54:01

0

我认为你正在寻找getchar()putchar()

#include <stdio.h> 
char line[MAX_LINE]; 
int i = 0; 
int c; 
while ((c = putchar(getchar())) != EOF) 
{ 
    line[i] =c; 
} 
2

下面的代码为我工作。谢谢你指点我正确的方向。 http://bytes.com/topic/c/answers/503640-getch-linux

#include <termios.h> 
#include <unistd.h> 

int mygetch(void) 
{ 
struct termios oldt, 
newt; 
int ch; 
tcgetattr(STDIN_FILENO, &oldt); 
newt = oldt; 
newt.c_lflag &= ~(ICANON | ECHO); 
tcsetattr(STDIN_FILENO, TCSANOW, &newt); 
ch = getchar(); 
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 
return ch; 

}