C语言:模拟密码输入显示星号
一个安全的程序在用户输入密码时不应该显示密码本身,而应该回显星号或者点号,例如······
或******
,这在网页、PC软件、ATM机、POS机上经常看到。但是C语言没有提供类似的功能,控制台上只能原样显示用户输入的字符。
我们完全可以模拟密码输入的效果,请先看下面的代码:
- #include <stdio.h>
- #include <conio.h>
- #include <ctype.h>
- #define PWDLEN 20
- void getpwd(char *pwd, int pwdlen);
- int main(){
- char pwd[PWDLEN+1];
- printf("Input password: ");
- getpwd(pwd, PWDLEN);
- printf("The password is: %s\n", pwd);
- return 0;
- }
- /**
- * 获取用户输入的密码
- * @param pwd char* 保存密码的内存的首地址
- * @param pwdlen int 密码的最大长度
- **/
- void getpwd(char *pwd, int pwdlen){
- char ch = 0;
- int i = 0;
- while(i<pwdlen){
- ch = getch();
- if(ch == '\r'){ //回车结束输入
- printf("\n");
- break;
- }
- if(ch=='\b' && i>0){ //按下删除键
- i--;
- printf("\b \b");
- }else if(isprint(ch)){ //输入可打印字符
- pwd[i] = ch;
- printf("*");
- i++;
- }
- }
- pwd[i] = 0;
- }
运行结果:
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语言:模拟密码输入显示星号的更多相关文章
- C语言隐形密码输入
今天费了老大的劲,终于做出来了!虽然简单,但也是自己的心血,分享一下! #include<stdio.h> #include<conio.h> int main(){ char ...
- Android之TextView密码输入变星号时间
private static class Visible extends Handler implements UpdateLayout, Runnable{ public Visible(Spann ...
- c语言一个显示星号的函数(隐藏密码)
显示星号 void star(char p[]) //显示星号 { int j; while((p[j] = getch())!='\r') { if(p[j] !='\b') { pr ...
- C控制台密码输入:输入一个字符显示一个星号
要在c控制台中输入一个字符显示一个星号, 则不能用"stdio.h'提供的库函数,因为它们都是带回显的,比如getchar() getchar()用来接收输入的字符串,输入一个字符就回显一个 ...
- 一个只能用在Win下的密码验证函数(显示星号,可删除)
以前做小程序时图好玩在网上找的代码.输入的密码会以星号显示出来,并且输入错了可以删除.因为用了专有库函数,所以只能在Windows平台使用,少用为好,不过可能还有点用.嗯…就这样了 #include ...
- 使用C#模拟键盘输入、鼠标移动和点击、设置光标位置及控制应用程序的显示
1.模拟键盘输入(SendKeys) 功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWa ...
- EditTextPreference点击后输入框显示隐藏内容,类似密码输入(转)
http://bbs.anzhuo.cn/thread-928131-1-1.html EditTextPreference点击后输入框显示隐藏内容,类似密码输入... [复制链接] aski ...
- 模拟邮箱输入邮箱地址、收藏标签。input框输入内容后回车,内容显示成小方块并带删除按钮。
模拟邮箱输入邮箱地址.收藏标签: 文本框输入文字后按回车键或者分号键,输入框中的文字变成小块并带删除按钮和操作. 页面代码: <!DOCTYPE html> <%@ page lan ...
- C语言重定向输入:txt文件内容是中文,重定向输入显示乱码的原因
一.txt文件中的内容是中文,重定向输入显示乱码原因: 是因为文本文件的编码和和编译器的不一致导致的.我文本文件用的编码是UTF-8,而编译器是ANSI,不匹配,所以输出乱码.文本另存为时把编码改为A ...
随机推荐
- Docker学习(8) Docker的CS模式
Docker的CS模式 链接方式 socket
- GO语言复合类型02---数组
package main import "fmt" /* 固定长度.固定类型的数据容器 */ /*数组的声明*/ func main031() { //var array [5]i ...
- 人工智能训练云燧T10
人工智能训练云燧T10 基于邃思芯片打造的面向云端数据中心的人工智能训练加速产品,具有高性能.通用性强.生态开放等优势,可广泛应用于互联网.金融.教育.医疗.工业及政务等人工智能训练场景. 超强算力 ...
- 编写HSA内核
编写HSA内核 介绍 HSA提供类似于OpenCL的执行模型.指令由一组硬件线程并行执行.在某种程度上,这类似于 单指令多数据(SIMD)模型,但具有这样的便利:细粒度调度对于程序员而言是隐藏的,而不 ...
- go 技巧: 实现一个无限 buffer 的 channel
前言 总所周知,go 里面只有两种 channel,一种是 unbuffered channel, 其声明方式为 ch := make(chan interface{}) 另一种是 buffered ...
- Django(63)drf权限源码分析与自定义权限
前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...
- 尼恩 Java高并发三部曲 [官方]
高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三部曲 > 面试必备 + 大厂必备 + 涨薪 ...
- 题解 P2257 YY的GCD
P2257 YY的GCD 解题思路 果然数论的题是真心不好搞. 第一个莫比乌斯反演的题,好好推一下式子吧..(借鉴了blog) 我们要求的答案就是\(Ans=\sum\limits_{i=1}^{n} ...
- 注册中心ZooKeeper,Eureka,Consul,Nacos对比
简介 服务注册中心本质上是为了解耦服务提供者和服务消费者.对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的.更进一步,为了支持弹性扩缩容特性,一个微服务的提供者 ...
- C++知识点大汇总
概述 1.1980年 贝尔实验室 Bjanre Stroustrup(比雅尼·斯特劳斯特鲁普)对C改进与扩充 最初称为"带类的C",(c with classes). 1983年正 ...