我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
控制台程序输入密码涉及到关闭回显,只要关闭了回显,别的就是常规操作了。输入的密码要不要显式成星号或者别的,纯属个人喜好。
主要用到下面几个知识:
- tcgetattr 获取终端属性
- tcsetattr 设置终端属性
- ECHO 终端属性的回显
- STDIN_FILENO 代表标准输入的文件描述符
输完密码还要把回显打开,所以最好包装起来,这是打开或关闭回显的代码:
bool setEcho(int fd,bool option)
{
int err;
struct termios term;
if(tcgetattr(fd,&term)==-1)
{
thelog<<"获得终端属性失败"<<ende;
return false;
}
if(option)
{
term.c_lflag|=ECHO;
}
else
{
term.c_lflag &=~ECHO;
}
err=tcsetattr(fd,TCSAFLUSH,&term);
if(err==-1 && err==EINTR)
{
thelog<<"设置终端属性失败"<<ende;
return false;
}
return true;
}
输入密码的代码,参数控制是否需要输入两次(一般用于设置密码):
string inputPassword(bool repeat)
{
string ret;
char buf[256];
//关回显
setEcho(STDIN_FILENO,false);
while(true)
{
cout<<"Please input password >"<<endl;
cin.getline(buf,256);
buf[255]='\0';
ret=buf;
if(repeat)
{
cout<<"Please repeat password >"<<endl;
cin.getline(buf,256);
buf[255]='\0';
if(ret==buf)break;
else cout<<"two inputs are diffrent"<<endl;
}
else break;
}
//开回显
setEcho(STDIN_FILENO,true);
return ret;
}
代码很简单。
以上代码是Unix/Linux下运行的,用到了C++,但关键关键操作完全是C的。
(这里是结束)