C 如何在不按enter end键的情况下获取输入而不查看屏幕上的输入?

C 如何在不按enter end键的情况下获取输入而不查看屏幕上的输入?,c,linux,terminal,C,Linux,Terminal,我想创建一个简单的游戏,其中一个对象在屏幕上移动“WASD”。问题是,getchar不按enter键就可以工作,但如果不在屏幕上显示它,它不会接受输入。我怎样才能解决它 PS:程序是用C语言编写的,在Linux终端上 //my code: while(1){ input = getchar(); if(input == 'a'){/*do something*/} if(input == 'd'){/*do something*/} //... } 由于您在Li

我想创建一个简单的游戏,其中一个对象在屏幕上移动“WASD”。问题是,
getchar
不按enter键就可以工作,但如果不在屏幕上显示它,它不会接受输入。我怎样才能解决它

PS:程序是用C语言编写的,在Linux终端上

//my code:
while(1){
    input = getchar();
    if(input == 'a'){/*do something*/}
    if(input == 'd'){/*do something*/}
    //...
}

由于您在Linux上,因此可以使用
termios.h
,这里是对旧
getch
conio.h
)的模拟:

#包括
#包括
#包括
#包括
#包括
静态结构术语,oterm;
静态int getch(void)
{
int c=0;
tcgetattr(0,&oterm);
memcpy(&term,&oterm,sizeof(term));
term.c|lflag&=~(ICANON | ECHO);
术语c_cc[VMIN]=1;
term.c_cc[VTIME]=0;
tcsetattr(0、TCSANOW和term);
c=getchar();
tcsetattr(0、TCSANOW和oterm);
返回c;
}
内部主(空)
{
puts(“按Q退出”);
而(1){
int c=getch();
开关(c)
{
案例“A”:
案例“a”:
看跌期权(“A被按下”);
打破
案例“D”:
案例“d”:
看跌期权(“D被按下”);
打破
/* ...*/
案例‘Q’:
案例‘q’:
退出(退出成功);
违约:
打破
}
}
返回0;
}

阅读
ncurses
(,),或者可能没有通用的便携方式。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

static struct termios term, oterm;

static int getch(void)
{
    int c = 0;

    tcgetattr(0, &oterm);
    memcpy(&term, &oterm, sizeof(term));
    term.c_lflag &= ~(ICANON | ECHO);
    term.c_cc[VMIN] = 1;
    term.c_cc[VTIME] = 0;
    tcsetattr(0, TCSANOW, &term);
    c = getchar();
    tcsetattr(0, TCSANOW, &oterm);
    return c;
}

int main(void)
{
    puts("Press Q to exit");
    while (1) {
        int c = getch();

        switch (c)
        {
            case 'A':
            case 'a':
                puts("A was pressed");
                break;
            case 'D':
            case 'd':
                puts("D was pressed");
                break;
            /* ...*/
            case 'Q':
            case 'q':
                exit(EXIT_SUCCESS);
            default:
                break;
        }
    }
    return 0;
}