Linux系统下解决getch()输入数值不回显示问题

在linux系统下开发C 程序却会遇到系统不支持conio.h头文件,无法使用getch()不回显函数。下面就演示如何构建函数实现数值输入不回显。

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <errno.h>
#define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL)
//函数set_disp_mode用于控制是否开启输入回显功能
//如果option为0,则关闭回显,为1则打开回显
int set_disp_mode(int fd,int option)
{
  int err;
  struct termios term;
  if(tcgetattr(fd,&term)==-1){
   perror("Cannot get the attribution of the terminal");
   return 1;
  }
  if(option)
    term.c_lflag|=ECHOFLAGS;
  else
    term.c_lflag &=~ECHOFLAGS;
  err=tcsetattr(fd,TCSAFLUSH,&term);
  if(err==-1 && err==EINTR){
    perror("Cannot set the attribution of the terminal");
    return 1;
  }
  return 0;
}
//函数getpasswd用于获得用户输入的密码,并将其存储在指定的字符数组中
int getpasswd(char* passwd, int size)
{
  int c;
  int n = 0;
  printf("Please Input password:");
  do{
   c=getchar();
   if (c != '\n'|c!='\r'){
     passwd[n++] = c;
   }
  }while(c != '\n' && c !='\r' && n < (size - 1));
  passwd[n] = '\0';
  return n;
}
int main()
{
  char *p,passwd[20],name[20];
  printf("Please Input name:");
  scanf("%s",name);
  getchar();//将回车符屏蔽掉
  //首先关闭输出回显,这样输入密码时就不会显示输入的字符信息
  set_disp_mode(STDIN_FILENO,0);
  //调用getpasswd函数获得用户输入的密码
  getpasswd(passwd, sizeof(passwd));
  p=passwd;
  while(*p!='\n')
   p++;
  *p='\0';
  printf("\nYour name is: %s",name);
  printf("\nYour passwd is: %s\n", passwd);
  printf("Press any key continue ...\n");
  set_disp_mode(STDIN_FILENO,1);
  getchar();
  return 0;
}

运行结果:

说明:Linux下C编程遇到要输入密码的问题,可输入的时候密码总不能让人看见吧,本来想用getch()来解决输入密码无回显的问题的,不料Linux-C中不支持getch(),我也没有找到功能类似的函数代替,上面这个例子达到了预期的效果。

PS:linux getch()实现代码如下所示:

#include <termio.h>
int getch(void)
{
   struct termios tm, tm_old;
   int fd = 0, ch;
   if (tcgetattr(fd, &tm) < 0) {//保存现在的终端设置
     return -1;
   }
   tm_old = tm;
   cfmakeraw(&tm);//更改终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理
   if (tcsetattr(fd, TCSANOW, &tm) < 0) {//设置上更改之后的设置
     return -1;
   }
   ch = getchar();
   if (tcsetattr(fd, TCSANOW, &tm_old) < 0) {//更改设置为最初的样子
     return -1;
   }
   return ch;
}

总结

以上所述是小编给大家介绍的Linux系统下解决getch()输入数值不回显示问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Linux系统下解决getch()输入数值不回显示问题

    在linux系统下开发C 程序却会遇到系统不支持conio.h头文件,无法使用getch()不回显函数.下面就演示如何构建函数实现数值输入不回显. #include <stdio.h> #include <termios.h> #include <unistd.h> #include <errno.h> #define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL) //函数set_disp_mode用于控制是否开启输入回

  • linux系统下pip升级报错的解决方法

    Pip 安装 1.在python中提供了一个get-pip.py;下面是地址 https://bootstrap.pypa.io/get-pip.py 2.在Linux下执行curl https://bootstrap.pypa.io/get-pip.py | python 进行下载安装 这样很方便了  想装什么包就装什么包 Pip install xxx 注意:升级完python版本注意,可能你的yum命令不能使用,因为yum命令使用python写的 # vi /usr/bin/yum #打开

  • linux系统下hosts文件详解及配置

    hosts文件 hosts -- the static table lookup for host name(主机名查询静态表). hosts文件是Linux系统上一个负责ip地址与域名快速解析的文件,以ascii格式保存在/etc/目录下.hosts文件包含了ip地址与主机名之间的映射,还包括主机的别名.在没有域名解析服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的ip地址,否则就需要使用dns服务程序来解决.通过可以将常用的域名和ip地址映射加入到hosts文件中

  • 详解linux系统下pid的取值范围

    一般PID_MAX=0x8000(可改),因此进程号的最大值为0x7fff,即32767. 进程号0-299保留给daemon进程. 现在的内核好像没有这个限制了,<linux内核设计与实现>上说为了与老版本的unix和linux兼容,pid的最大值默认是32767(short int的最大值),如果你需要的话还可以不考虑和老版本兼容,修改/proc/sys/kernel/pid_max来提高上限用echo重新写入一个数值到这个文件即可. 由于一般机器不可能同时跑那么多进程+线程,所以3276

  • 在linux系统下安装python librtmp包的实现方法

    安装librtmp包需要依赖环境较多,机器上已经安装了python2.7版本,安装librtmp包之前需要先安装依赖环境. 1.安装gcc和依赖包 yum install gcc* python-devel libffi-dev* -y 2.安装librtmp 从git上下载源码: git clone git://git.ffmpeg.org/rtmpdump cd rtmpdump/librtmp/ make && make install 3.安装setuptools wget -S

  • Windows+Linux系统下Go语言环境安装配置过程

    Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本.现在Go的开发已经是完全开放的,并且拥有一个活跃的社区. 1. Windows安装配置 1️⃣ 下载SDK SDK 的全称是Software Development Kit

  • Linux 系统下搭建 Gitlab 服务器的过程分析

    目录 1.安装依赖工具 2.安装 Postfix 邮件服务器 3.安装防火墙 4.添加 gitlab 镜像源并安装 gitlab 服务器 5.安装 gitlab 6.安装后修改 gitlab 配置文件,指定访问服务器 ip 和自定义端口 7.重置 Gitlab(让修改后的配置生效) 8.启动 gitlab 并通过 ip + 端口访问 9.登录 gitlab 1.安装依赖工具 // 安装技术依赖 yum install -y curl policycoreutils-python openssh-

  • 最新Linux系统下安装MySql 5.7.17全过程及注意事项

    1.cd /usr/local/ ##进入local目录 2.cp /home/soft/MySQL-5.7.15-Linux-glibc2.5-x86_64.tar.gz /usr/local/ ##拷贝mysql压缩到local目录 3.cd /usr/local/ ##进入local目录 4.tar -xzvf mysql-5.7.15-linux-glibc2.5-x86_64.tar.gz ##解压mysql压缩包 5.mv mysql-5.7.15-linux-glibc2.5-x8

  • 浅析Linux系统下安装wetty和使用说明

    以下内容从wetty简介.环境准备.wetty安装.以及验证方面给大家分析,具体详情请看下文吧. 1. Wetty简介 Wetty是使用Node.js和websockets开发的一个开源Web-based SSH.关于Web-based SSH的更多资料请参考https://en.wikipedia.org/wiki/Web-based_SSH. 而wetty的资料请参考https://github.com/krishnasrinivas/wetty. 2. 环境准备 因为wetty是使用Nod

  • Linux系统下Mysql使用简单教程(一)

    如果你会查询这些相关的问题,说明你是一个正在或者准备从事IT的程序猿,对于一个程序猿而言,不会使用linux系统的程序猿不是一好的程序猿哦!因为windows有时候真的让人很抓狂,而本人也相信没有什么习惯是不可以改变的.so以下都是在linux系统中的使用: 安装mysql命令 :$ sudo apt-get install -y mysql-server 查看mysql的版本命令(注意-V是大写,不然会出现如下错误):$ mysql -V 启动mysql命令(其它关闭,重启等功能只需将star

随机推荐