一个安全的程序在用户输入密码时不应该显示密码本身,而应该回显星号或者点号,例如······******,这在网页、PC软件、ATM机、POS机上经常看到。但是C语言没有提供类似的功能,控制台上只能原样显示用户输入的字符。

我们完全可以模拟密码输入的效果,请先看下面的代码:

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <ctype.h>
  4. #define PWDLEN 20
  5. void getpwd(char *pwd, int pwdlen);
  6. int main(){
  7. char pwd[PWDLEN+1];
  8. printf("Input password: ");
  9. getpwd(pwd, PWDLEN);
  10. printf("The password is: %s\n", pwd);
  11. return 0;
  12. }
  13. /**
  14. * 获取用户输入的密码
  15. * @param pwd char* 保存密码的内存的首地址
  16. * @param pwdlen int 密码的最大长度
  17. **/
  18. void getpwd(char *pwd, int pwdlen){
  19. char ch = 0;
  20. int i = 0;
  21. while(i<pwdlen){
  22. ch = getch();
  23. if(ch == '\r'){ //回车结束输入
  24. printf("\n");
  25. break;
  26. }
  27. if(ch=='\b' && i>0){ //按下删除键
  28. i--;
  29. printf("\b \b");
  30. }else if(isprint(ch)){ //输入可打印字符
  31. pwd[i] = ch;
  32. printf("*");
  33. i++;
  34. }
  35. }
  36. pwd[i] = 0;
  37. }

运行结果:
Input password: *********
The password is: 123456789

代码中定义了一个函数 getpwd(),它有两个参数:pwd 为保存密码的内存的首地址,pwdlen 为密码的最大长度。

函数通过 while 循环来不断读取用户输入的字符,并逐一对它们进行处理:

  • 如果用户按下回车键,表示输入结束了,getch() 将会读取到\r
  • 如果用户按下删除键,表示删除前面的字符,getch() 将会读取到\b
  • 如果用户输入可打印字符,那么就读取该字符并回显星号。

while 循环中之所以使用 getch() 来获取字符,是因为该函数既没有回显也没有缓存,可以立即读取到用户输入的字符,并且不会在屏幕上显示出来。

从循环条件 i<pwdlen 可以看出,当用户输入的密码超过最大长度时跳出循环,结束输入。

用户按下回车键时,getchar() 将读取到\n字符,而 getch() 将读取到\r字符。也就是说,对于不同的字符输入函数,回车键产生的字符不同,这个细节读者要引起注意。

删除密码的思路

密码保存在字符数组中,当用户按下删除键时,不仅要删除前面的星号,还应该删除字符数组中前面的元素。

需要注意的是,数组中的元素在内存中是连续分布的,无法直接删除。上面代码中,我们并没有对数组元素进行任何操作,而是将变量 i 减 1,跳过要删除的字符。这些本该被删除的字符依然留在数组中,它们会被后续输入的字符覆盖掉。

第29行代码中,我们通过printf("\b \b");来删除前面的星号。\b表示退格,也就是光标向后移动一个位置。退格,输出空格,再退格就能删除前面的星号。例如我们输入了密码 123,它在屏幕上显示为:

***_

输出一个退格,光标向前移动一个字符的位置,变为:

***

此时再输出一个空格,星号就会被覆盖掉,变为:

** _

虽然星号被空格替换掉了,但是光标也同时向后移动了一个位置,这样光标和星号之间就有了一个字符的间隔,所以还需要再输出一个退格,消除间隔。再输出一个退格后变为:

**_

函数体最后一行代码也至关重要,它向字符数组中添加了字符串结束符,决定者密码在何处结束。

C语言:模拟密码输入显示星号的更多相关文章

  1. C语言隐形密码输入

    今天费了老大的劲,终于做出来了!虽然简单,但也是自己的心血,分享一下! #include<stdio.h> #include<conio.h> int main(){ char ...

  2. Android之TextView密码输入变星号时间

    private static class Visible extends Handler implements UpdateLayout, Runnable{ public Visible(Spann ...

  3. c语言一个显示星号的函数(隐藏密码)

    显示星号 void star(char p[])    //显示星号 {     int j; while((p[j] = getch())!='\r') { if(p[j] !='\b') { pr ...

  4. C控制台密码输入:输入一个字符显示一个星号

    要在c控制台中输入一个字符显示一个星号, 则不能用"stdio.h'提供的库函数,因为它们都是带回显的,比如getchar() getchar()用来接收输入的字符串,输入一个字符就回显一个 ...

  5. 一个只能用在Win下的密码验证函数(显示星号,可删除)

    以前做小程序时图好玩在网上找的代码.输入的密码会以星号显示出来,并且输入错了可以删除.因为用了专有库函数,所以只能在Windows平台使用,少用为好,不过可能还有点用.嗯…就这样了 #include ...

  6. 使用C#模拟键盘输入、鼠标移动和点击、设置光标位置及控制应用程序的显示

    1.模拟键盘输入(SendKeys) 功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWa ...

  7. EditTextPreference点击后输入框显示隐藏内容,类似密码输入(转)

    http://bbs.anzhuo.cn/thread-928131-1-1.html EditTextPreference点击后输入框显示隐藏内容,类似密码输入... [复制链接]     aski ...

  8. 模拟邮箱输入邮箱地址、收藏标签。input框输入内容后回车,内容显示成小方块并带删除按钮。

    模拟邮箱输入邮箱地址.收藏标签: 文本框输入文字后按回车键或者分号键,输入框中的文字变成小块并带删除按钮和操作. 页面代码: <!DOCTYPE html> <%@ page lan ...

  9. C语言重定向输入:txt文件内容是中文,重定向输入显示乱码的原因

    一.txt文件中的内容是中文,重定向输入显示乱码原因: 是因为文本文件的编码和和编译器的不一致导致的.我文本文件用的编码是UTF-8,而编译器是ANSI,不匹配,所以输出乱码.文本另存为时把编码改为A ...

随机推荐

  1. VUE3后台管理系统【路由鉴权】

    前言: 在"VUE3后台管理系统[模板构建]"文章中,详细的介绍了我使用vue3.0和vite2.0构建的后台管理系统,虽然只是简单的一个后台管理系统,其中涉及的技术基本都覆盖了, ...

  2. ASP.NET Core MVC 入门到精通 - 1. 开发必备工具 (2021)

    环境: .NET 5 ASP.NET Core MVC 1. .NET 5 作为一个资深.NET工程师,说句实话,.NET没落了,在国内更加的没落.之前做过8年node.js/前端,现如今又转回了.N ...

  3. Pptx的形状转为WPF的Geometry

    本文是将演示如何解析pptx文件的形状到WPF当中,并且绘制显示出来 安装Openxml sdk 首先,我们先安装nuget的openxml sdk,下面两种方式都可以安装: nuget包管理器控制台 ...

  4. ARM系列处理器和架构

    从一只ARM到另一只ARM! ARM处理器和架构 当前可用的处理器 ARM1 ARM2 ARM3 ARM4和5 ARM6 ARM7 ARM8 强壮有力的ARM ARM9 ARM10 ARM架构 v1  ...

  5. SpringBoot系列——cache缓存

    前言 日常开发中,缓存是解决数据库压力的一种方案,通常用于频繁查询的数据,例如新闻中的热点新闻,本文记录springboot中使用cache缓存. 官方文档介绍:https://docs.spring ...

  6. HTML基本标签及语法

    HTML简介 什么是HTML 本文素材来源于黑马程序员Pink老师 HTML 指的是超文本标记语言(Hyper Text Markup Language) ,它是用来描述网页的一种语言. HTML 不 ...

  7. Mac下安装及配置Appium环境

    candiceli   Mac下安装及配置Appium环境 我是小白,自己研究appium好几周了. 一开始按照同事这篇文章设置Mac下的环境,http://www.cnblogs.com/tangd ...

  8. canal+mysql+kafka实时数据同步安装、配置

    canal+mysql+kafka安装配置 概述 简介 canal译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 基于日志增量订阅和消费的业务包括 数 ...

  9. centos 7 iotop 安装

    安装指令:yum -y install iotop 指定查看aubunt 用户的读写状态:iotop -u aubunt -P -k -t 允许在非交互模式下每隔3秒刷新一次,只刷新6次:iotop ...

  10. 学习JDK源码(一):String

    用了好久的Java了,从来没有看过jdk的源码,趁着今天有点时间,拿出了jdk的源码看了下,今天先看了关于String的,毕竟开发中String类型使用最广泛.在我们下载安装jdk的时候,部分源码也已 ...