LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3470|回复: 44

一个关于如何获得键盘输入的问题

[复制链接]
发表于 2007-1-1 16:31:17 | 显示全部楼层 |阅读模式
一个很简单的程序.
dos.h里面有getkey()函数很好用.

linux下面有没有类似这样的命令呢?
我已经找过很多地方都没有找到类似的.请大家帮忙出出主意
  1. //如果按下ESC键就推出循环否则 无论有没有按任何按钮都进行循环.
  2. int main()
  3. {
  4.     int goout==1;
  5.     while(goout == 1)
  6.     {
  7.          //这里按下一个按键
  8.          if(????()==ESC)
  9.              goout=0;
  10.      }
  11.    return 0;
  12. }
复制代码
谢谢大家,我已经找很久了,最近网络也不太争气...
发表于 2007-1-1 16:59:05 | 显示全部楼层
搜这个坛子,提到过
linuxforum.net的C版精华里也有
回复 支持 反对

使用道具 举报

发表于 2007-1-1 18:34:08 | 显示全部楼层
#include <stdio.h>

里边有 getc() 函数应该可以用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-1 20:18:52 | 显示全部楼层
楼上的办法不行啊...
因为getc() 循环就停在那里了,直到你按下键盘才能进入下一次循环
回复 支持 反对

使用道具 举报

发表于 2007-1-1 20:23:37 | 显示全部楼层
我觉得这要设置键盘输入的方式,我本人没有具体试过,就是取消键盘输入缓冲。
要输入一个字符,可以用getchar()来得到,但是,要多按一个“回车”。

如要输入 ESC,则输入 ESC ENTER两个字符

若能取消键盘IO缓冲,以下程序则可以实现你的愿望。
本人做过在嵌入式系统下取消IO缓冲,但PC机没有试过,现在没时间搞这个。

希望你成功!(成功后,可以把经验留给大家分享哦)

#include <stdio.h>

int main()
{
    while(1){
      if(getch()== 27) break;
    }

    return 0;
}
回复 支持 反对

使用道具 举报

发表于 2007-1-1 22:23:31 | 显示全部楼层
http://www.linuxforum.net/forum/ ... mp;o=all&fpart=
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <termios.h>



static struct termios originalTermParam;



static void set_keypress ( void )

{

    struct termios currentTermParam;



    tcgetattr( 0, &originalTermParam );

    memcpy( &currentTermParam, &originalTermParam, sizeof( struct termios ) );



    /* Disable canonical mode, and set buffer size to 1 byte */

    currentTermParam.c_lflag       &= ~ICANON;

    currentTermParam.c_lflag       &= ~ECHO;

    currentTermParam.c_cc[ VTIME ]  = 255;

    currentTermParam.c_cc[VMIN]     = 1;



    tcsetattr( 0, TCSANOW, &currentTermParam );

    return;

}  /* end of  set_keypress */



void reset_keypress ( void )

{

    tcsetattr( 0, TCSANOW, &originalTermParam );

    return;

}  /* end of reset_keypress */



int main ( void )

{

    puts( "main start" );

    set_keypress();

    while ( 1 )

    {

        if ( getchar() == ( int )'q' )

        {

            break;

        }

    }

    reset_keypress();

    puts( "main stop" );

    return( EXIT_SUCCESS );

}  /* end of main */
回复 支持 反对

使用道具 举报

发表于 2007-1-2 08:53:43 | 显示全部楼层
谢谢版主,呵呵,看了一下,似曾相识!我在嵌入式的串口通信中也用过类似的做法。
温故知新,努力前进!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 11:16:25 | 显示全部楼层
谢谢大家的帮助,也十分感谢zhllg对我的热心支持.
不过..似乎我的例子大家没有充分理解..

在while() 循环中,我希望能让循环一直进行下去.而不是停在getchar()等待按键命令.

如果在dos下面可以直接用类似getkey()这种函数方便的处理了. 就是你没有按下任何按键的时候循环是无限进行的.


有些linux程序也用这个类似的情况,比如 一个行号不停的 "\"  "|" "/" 这三个字符不停的转动.而你按下一个按键 程序就退出了.

我正在研究NCURSES库希望找到应用的办法.谢谢大家
http://poet.cosoft.org.cn/downloads/docs/ncurses-cn-2nd.pdf
同时提供这个库的how to文档地址 和大家一起分享. 这个是一个CUI的库.编写一些CUI程序很方便.
回复 支持 反对

使用道具 举报

发表于 2007-1-2 11:30:37 | 显示全部楼层
对版主上传的程序中的 while()循环改一下不就行了么?
具体忘记了,资料在Window下,

大概是没有输入时
continue; 继续循环
有输入时就 break;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 14:33:43 | 显示全部楼层
windows下面的消息机制比较健全..有等待消息的时候用一种获取消息的方法,漏过消息的时候用另外的办法..
问题是 进入getchar()之后不输入没有办法跳出啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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