如何用C实现密码输入效果

分类 - 代码 共有 4 条评论

如何实现密码的 * 隐藏,实现密码的输入?
首先大家看看一个效果图
展示效果

那么想要实现这样的效果应该怎么做呢?
首先我们很自然的能想到使用printf 和getch() ps:在vs中为_getch()

getch();    
printf("*");

每当从getch()中读入一个字符就输出一个 *
其实到这里已经成功了一大半了
如果不知道为什么要用getch(),那我们就来讲讲getch()的作用吧~
getch() 和getchar()特别像,学过C语言的同学应该都知道getchar()的作用是从键盘中读取一个字符,并且显示在屏幕上。
我们的getch()和getchar()的不同点在于,getch()从键盘中读取到的数据是不回显的。
这样的好处是输入密码的时候不会显示密码,从而达到了我们的目的。
大家可以编写一个小程序测试一下。
c2fdfc039245d688c56332adacc27d1ed21b2451.jpg

从ASCII码表上我们可以得到 回车的 ASCII 值为 13 退格的 ASCII 值为 8

那我们就先来具体实现一下吧:

int i = 0;//用于计数
char ch;//用于存放中间字符
char password[20];//定义一个大小为20的字符串用于存放密码
while(ch = getch() , ch != 13)//以回车作为结束的标志
{
    printf("*");//输出 *
    password[i] = ch;//将读入的字符存入相应的位置
    i++;//字符指针向后移动一位以便下次输入
}
    password[i]='\0';//给字符串一个结束的标志

这样下来我们就会得到一个名为password的一串字符,这里面包含了我们输入的密码。
这就是一个最简单的密码输入的实现。它只支持输入密码字符,却不能删除密码字符。
既然能够输入密码,那么应该也需要删除密码字符才对。
想到这里就可以对原代码进行改进

int i = 0;//用于计数
char ch;//用于存放中间字符
char password[20];//定义一个大小为20的字符串用于存放密码
Type:while(ch=getch() , ch!=13)//以回车作为结束的标志
{
    if(ch == 8)//当遇到退格的时候
    {
        printf("\b \b");//清空显示缓冲
        i--;//字符指针回到原位重新输入
        goto Type;//利用goto语句回到输入端口重新输入
    }
    else//将输入放到这里是为了避免每次需要先输出一个星号再进行其他操作,并且方便了后续的密码上下限检测。
    {
        printf("*");//输出 *
        password[i] = ch;//将读入的字符存入相应的位置
        i++;//字符指针向后移动一位以便下次输入
    }
}
password[i]='\0';//给字符串一个结束的标志

这样就实现了密码的键入和删除

我们还需要解决的是越界的问题,同样也可以用if()语句来实现判断,修改的代码如下:

int i = 0;//用于计数
char ch;//用于存放中间字符
char password[20];//定义一个大小为20的字符串用于存放密码
Type:while(ch = getch() , ch != 13)//以回车作为结束的标志
{
    if(i == 0 && (ch == 8||ch == 13))//当什么都没输入(i=0),就退格或者按回车的时候
    {
        goto Type;//利用goto语句回到输入端口重新输入(这样就解决了下限的问题)
    }
    else if(ch == 8)//当遇到退格的时候
    {
        Del:printf("\b \b");//清空显示缓冲
        i--;//字符指针回到原位重新输入
        goto Type;//利用goto语句回到输入端口重新输入
    }
    else
    {
        printf("*");//输出 *
        password[i] = ch;//将读入的字符存入相应的位置
        i++;//字符指针向后移动一位以便下次输入
        if(i==20 && ch != 8)//如果i=20,则说明接下来即将输入password[20]了,这时候就说明越界了。如果ch里面不是退格的话,我们需要强制退格。(这里没有判断回车是因为如果是回车就退出了while循环了)
        {
            goto Del;//回到Del,字符指针移到password[19],并且清空第20个 *
        }
     }
}
 password[i]='\0';//给字符串一个结束的标志到这里一个稍微复杂一点的密码输入就完成了。

完整测试代码

#include<stdio.h>
#include<conio.h>
#include<windows.h>
int main()
{

   int i = 0;
   char ch;
   char password[20];
   Type:while (ch = getch(), ch != 13)
   {
       if (i == 0 && (ch == 8 || ch == 13))
       {
           goto Type;
       }
       else if (ch == 8)
       {
           Del:printf("\b \b");
           i--;
       }
       else
       {
           printf("*");
           password[i] = ch;
           i++;
           if (i == 20 && ch != 8))
           {
               goto Del;
           }
       }
   }
password[i] = '\0';
printf_s("\nYour Password is:%s",password);
system("pause");
return 0;
}

测试效果图

1.jpg

如果你有好的想法,意见或建议,欢迎在评论区留言~
转载请说明出处

文章评论
  1. Eco

    学到很多!

    回复
  2. panghu

    哈哈哈,在B站关注你的

    回复
  3. 两点半

    强势围观 虽然看不懂 哈哈哈

    回复
    1. @两点半

      哈哈~欢迎关注

      回复