QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 831|回复: 10

请教一个字符输入的问题

[复制链接]
发表于 2003-6-4 22:03:53 | 显示全部楼层 |阅读模式
我想从终端读入字符,一次一个,但是希望用户一按键立即返回,不用等按回车键(象getchar()),怎样才能办到呢?不用cursue库
发表于 2003-6-5 09:24:52 | 显示全部楼层
试试看用setbuf关闭stdin的缓存
回复

使用道具 举报

发表于 2003-6-5 12:01:10 | 显示全部楼层
getch?
回复

使用道具 举报

发表于 2003-6-5 12:35:07 | 显示全部楼层
修改termios属性,使用原始输入,就可以了
回复

使用道具 举报

发表于 2004-7-24 14:29:48 | 显示全部楼层
up一下,我现在也遇到这个问题
请问应该怎么解决?哪位能给一个具体点儿的例子?
回复

使用道具 举报

发表于 2004-7-24 14:34:48 | 显示全部楼层
没有类似函数(有人说这影响了unix下的游戏开发),mozilla有解决办法,希望大家学会用论坛的搜索功能。http://www.linuxfans.org/nuke/mo ... mp;highlight=getche
回复

使用道具 举报

发表于 2004-7-24 14:40:12 | 显示全部楼层
多谢,我倒是搜了,可不知道搜什么关键字,结果只搜到这个n老的文章,还没有解决。。。。 :-(
回复

使用道具 举报

发表于 2004-7-24 14:46:00 | 显示全部楼层
mozilla这个不行吗?
回复

使用道具 举报

发表于 2004-7-24 16:13:05 | 显示全部楼层
我说的是我搜到的这个文章没有解决办法
mozilla的还没试,手头暂时没有linux机器,要回去才能试
回复

使用道具 举报

发表于 2004-7-24 18:32:27 | 显示全部楼层
   我试过,可以的。
回复

使用道具 举报

发表于 2004-7-24 22:28:53 | 显示全部楼层
在编程时一般需要自己编写合适的读键函数(因为系统不直接提供呗),我前年在作华容道ncurses版参考了svgalib源码而写的,但它并不依赖svgalib和ncurses,代码如下(当然当时为了游戏的需要定义了一些特殊键):
[code:1]
#include <termios.h>
#include <sys/ioctl.h>

#define K_ESC     -1
#define K_UP      -8
#define K_DOWN    -9
#define K_LEFT    -10
#define K_RIGHT   -11
#define K_ENTER   -12
#define K_SPACE   -13
#define K_F1      -21
#define K_F2      -22
#define K_F3      -23
#define K_F4      -24
#define K_F5      -25
#define K_UNUSE   -111

int vga_getkey(void)        /* This function come from source code of */
{                           /* svgalib-1.4.3 and nothing modified     */
    struct termio zap, original;
    int e;
    char c;

    ioctl(fileno(stdin), TCGETA, &original);    /* Get termio */
    zap = original;
    zap.c_cc[VMIN] = 0;                         /* Modify termio  */
    zap.c_cc[VTIME] = 0;
    zap.c_lflag = 0;
    ioctl(fileno(stdin), TCSETA, &zap);         /* Set new termio */
    e = read(fileno(stdin), &c, 1);             /* Read one char */
    ioctl(fileno(stdin), TCSETA, &original);    /* Restore termio */
    if (e != 1)
        return 0;                               /* No key pressed. */
    return c;                                   /* Return key. */
}
/*------------------*/
int my_getkey(void)
{
  int key;
  for(;;){
    key=vga_getkey();
    if(key!=0)break;         /* If no key pressed then continue. */
  }
  if(key != 0x1b) {  /* not ESC */
    switch (key) {
      case 10:
        return K_ENTER;      /* ENTER */
      case 32:
        return K_SPACE;      /* Space */
      default:
        return key;             /* 普通键直接返回键值 */
    }
  }
  if((key = vga_getkey()) != '[') {
    return K_ESC;            /* it was ESC */
  }
  switch (key = vga_getkey()) {
    case 'A':
      return K_UP;           /* up */
    case 'B':
      return K_DOWN;         /* down */
    case 'C':
      return K_RIGHT;        /* right */
    case 'D':
      return K_LEFT;         /* left */
    case '[':
      switch (key = vga_getkey()) {
        case 'A':
          return K_F1;
        case 'B':
          return K_F2;
        case 'C':
          return K_F3;
        case 'D':
          return K_F4;
        case 'E':
          return K_F5;
        default:
          return -111;
      }
    default:
      return -111;         /* ignore */
  }
}
/*------------------*/
[/code:1]

这个函数适合一般输入(这时可以删除掉返回特殊键值如方向键、F1等功能键的语句),也可用于对按键要求比较特殊的游戏。因为游戏中不会一直等待按键,所以没有按键时my_getkey()函数会立即返回,你可以修改它等到有按键输入为止,或者再写个get_char()之类的函数来封装它好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 20:51 , Processed in 0.037874 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表