我怎样使我的程序不回射输入?
================================
我怎样能使我的程序不回射输入,就象登录时询问我的口令时那样?
有一个简单方法,也有一个稍微复杂点的方法:
简单方法是使用‘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()’函数测试输入是否可读。
================================
我怎样能使我的程序不回射输入,就象登录时询问我的口令时那样?
有一个简单方法,也有一个稍微复杂点的方法:
简单方法是使用‘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()’函数测试输入是否可读。