免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5697 | 回复: 21
打印 上一主题 下一主题

c程序与标准输入 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2001-12-29 13:44 |只看该作者 |倒序浏览
请问如何在c程序里面实现对用户每次按键输入都马上接收以进行处理,
而不是在回车以后?

谢谢!

论坛徽章:
0
2 [报告]
发表于 2001-12-29 13:57 |只看该作者

c程序与标准输入

getc(stdin)

论坛徽章:
0
3 [报告]
发表于 2001-12-29 14:38 |只看该作者

c程序与标准输入

mygod错了!getc()虽然不要回车,但要让系统处理必须调皮个回车,不信你可以去试一下。
至于该怎样才能做到这一点,我也不知道。

论坛徽章:
0
4 [报告]
发表于 2001-12-29 14:47 |只看该作者

c程序与标准输入

那就是getch()了,反正是两者之一!
小问题

论坛徽章:
0
5 [报告]
发表于 2001-12-29 16:50 |只看该作者

c程序与标准输入

用IOCTL还是FCNTCL的(记不清了)设置输入端口参数

论坛徽章:
0
6 [报告]
发表于 2001-12-30 12:20 |只看该作者

c程序与标准输入

程序实现:
#include <stdio.h>;
#include <termio.h>;

static struct termio ttysave ;
void restore() ;
char getch() ;

main()
{
puts( &quot;---------------------------&quot; ) ;
puts( &quot;enter a key : &quot; );
getch() ;
puts( &quot;\n--------------&quot; );
exit( 0 );
}

char getch()
{
    static char ch ;
    static int total, flag = 1 ;
    struct termio tty ;

    if( flag )
    {
        flag = 0 ;
        if( ioctl( 0, TCGETA, &amp;tty ) == -1 )
        {
              perror( &quot;ioctl&quot; );
              exit( -1 );
         }
         ttysave = tty ;
         tty.c_lflag &amp;= ~( ICANON | ECHO | ISIG ) ;
         tty.c_cc[VMIN] = 1  ;    // MIN
         tty.c_cc{VTIME] = 0 ;    // TIME
         if( ioctl( 0, TCSETAF, &amp;tty ) == -1 )
         {
                restore();
                perror( &quot;ioctl&quot; );
                exit( -2 );
         }
    }

    switch( total = read( 0, &amp;ch, 1 ))
    {

case -1 :
restore() ;
perror( &quot;read&quot; );
exit( 3 );
case 0:
restore():
fputs( &quot;EOF error!&quot;, stderr );
exit( 4 ) ;
default:
.....
    }

    restore();
    return( ch );
}


void restore()
{
   if( ioctl( 0, TCSETAF, &amp;ttysave ) == -1 )
   {
perror( &quot;ioctl&quot; );
        exit( 5 );
   }
    return ;
}

论坛徽章:
0
7 [报告]
发表于 2001-12-30 12:23 |只看该作者

c程序与标准输入

其说明可参见《深入学习UNIX》清华大学出版社 刘祖亮编著  1997年8月第一版

论坛徽章:
0
8 [报告]
发表于 2001-12-31 13:24 |只看该作者

c程序与标准输入

谢谢各位!!
getch()的确可以,相信vt8000提供的代码也没有问题,因为我是看到类似的程序才提这个问题的~~

那么能否再讲讲这两者之间的异同呢?

论坛徽章:
0
9 [报告]
发表于 2001-12-31 13:43 |只看该作者

c程序与标准输入

在UNIX里并没有直接的getch,能读入一个字符而不回车自行进行读取工作。
另外一种方法是利用curses库,再用getch():
#include <curses.h>;
#include <sys/select.h>;

int Zinkey()
{
  int k;
  fd_set f;
  struct timeval t;

  FD_ZERO( &amp;f );
  FD_SET( 0, &amp;f );
  t.tv_sec = 0;
  t.tv_usec = 100000L;
  if( !select( 1, &amp;f, 0, 0, &amp;t ) )
    return( 0 );
  if( ( k = getch() ) == ERR )
    k = 0;
  return( k );
}



论坛徽章:
0
10 [报告]
发表于 2002-11-14 16:49 |只看该作者

c程序与标准输入

getchar()可以读入int吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP