终端输入/输出

我怎样使我的程序不回射输入?
================================

我怎样能使我的程序不回射输入,就象登录时询问我的口令时那样?

有一个简单方法,也有一个稍微复杂点的方法:

简单方法是使用‘getpass()’函数,它几乎能在所有Unix系统上找到。它以一个
给定的字符串参数作为提示符(prompt)。它读取输入直到读到一个‘EOF’或换
行符(译者注:‘EOF’用‘^d’输入,而换行符为‘^m’或回车)然后返回一个
指向位于静态内存区包含键入字符的字符串指针。(译者注:字符串不包含换行
符)

复杂一点的方法是使用‘tcgetattr()’函数和‘tcsetattr()’函数,两个函数都使用
一个‘structtermios’结构来操纵终端。下面这两段程序应当能设置回射状态和
不回射状态。

#include<stdlib.h>
#include<stdio.h>

#include<termios.h>
#include<string.h>

staticstructtermiosstored_settings;

voidecho_off(void)
{
structtermiosnew_settings;
tcgetattr(0,&stored_settings);
new_settings=stored_settings;
new_settings.c_lflag&=(~ECHO);
tcsetattr(0,TCSANOW,&new_settings);
return;
}

voidecho_on(void)
{
tcsetattr(0,TCSANOW,&stored_settings);
return;
}

两段程序使用到的都是在POSIX标准定义的。

我怎样从终端读取单个字符?
==============================

我怎样从终端读取单个字符?我的程序总是要等着用户按回车。

终端通常在标准(canonical)模式,在此模式输入总是经编辑后以行读入。你可以
设置终端为非标准(non-canonical)模式,而在此模式下你可以设置在输入传递给
你的程序前读入多少字符。你也可以设定非标准模式的计时器为0,这个计时器
根据设定的时间间隔清空你的缓冲区。这样做使你可以使用‘getc()’函数立即
获得用户的按键输入。我们使用的‘tcgetattr()’函数和‘tcsetattr()’函数都
是在POSIX中定义用来操纵‘termios’结构的。

#include<stdlib.h>
#include<stdio.h>

#include<termios.h>
#include<string.h>

staticstructtermiosstored_settings;

voidset_keypress(void)
{
structtermiosnew_settings;

tcgetattr(0,&stored_settings);

new_settings=stored_settings;

/*Disablecanonicalmode,andsetbuffersizeto1byte*/
new_settings.c_lflag&=(~ICANON);
new_settings.c_cc[VTIME]=0;
new_settings.c_cc[VMIN]=1;

tcsetattr(0,TCSANOW,&new_settings);
return;
}

voidreset_keypress(void)
{
tcsetattr(0,TCSANOW,&stored_settings);
return;
}

我怎样检查是否一个键被摁下?
================================

我怎样检查是否一个键被摁下?在DOS上我用‘kbhit()’函数,但是在UNIX
上看来没有相同作用的函数?

如果你设定了终端为单一字符模式(参见上一个问题解答),那么(在大多数系统)
上你可以使用‘select()’函数或‘poll()’函数测试输入是否可读。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值