上学期在写了一个小项目,现在想把它移植到linux上,但是getch()这个函数在linux中愣是让我使用不愉快,安装了个curese,在网上找了一堆东西都没解决。最后还是自己模拟实现一个感觉还简单些。代码如下
/*---------------------------------------
** copyright (c) 2013-3-2 DeltaYang
** E-mail: DeltaYang89@gmail.com
** getch.c:模拟实现getch()
**--------------------------------------*/
#include <stdio.h>
#include <termios.h> //操作终端
#include <unistd.h>
#include <assert.h>
#include <string.h>
char getch()
{
int c=0;
struct termios org_opts, new_opts;
int res=0;
//保留终端原来设置
res=tcgetattr(STDIN_FILENO, &org_opts);
assert(res==0);
//从新设置终端参数
memcpy(&new_opts, &org_opts, sizeof(new_opts));
new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL);
tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
c=getchar();
//恢复中断设置
res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);assert(res==0);
return c;
}
//测试模拟密码输入
int main(int argc,char** argv)
{
int pwdlen=10;
char ch[10];
int i=0;
printf("PASSWORD:");
fflush(stdin);
ch[0]=getch();
while(ch[i]!='\n'&&i<9)
{
printf("*");
i++;
ch[i]=getch();
}
ch[i]='\0';
printf("\n---->:%s\n",ch);
}
[delta@localhost:getch]$ gcc getch.c -o getch
[delta@localhost:getch]$ ./getch
PASSWORD:********
---->:detlfhgh
[delta@localhost:getch]$