Skip to Content

linux下利用C实现输入密码返回*的功能

Posted on

C++也兼容这个功能

#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <assert.h>
int getch(void);
char psw[20];//初始化密码为空"";
int length=0; //初始化密码长度
void inputPassword()//用于输入并回显*为密码
{
    char temp_c;
    printf("password:");
    while(1)
    {
        temp_c=getch();  //输入一个字符
        if(temp_c!='\n')  //判断该字符是不为回车,如果是则退出while
        {
            switch (temp_c)
            {
            case 127:
                if(length!=0)
                {
                    printf("\b \b");
                    length--;
                }
                else;
                break;
            default:
                printf("*"); //可用用你喜欢的任意字符,如改为puts"";则无回显
                psw[length] = temp_c;//连成字符串;
                length++;
                break;
            }
        }
        else break;
    }
    psw[length] = '\0';
}
char* getpassword()//返回一个密码字符串。
{
    return psw;
}

int getch(void)
{
        int c=0;
        struct termios org_opts, new_opts;
        int res=0;
        //-----  store old settings -----------
        res=tcgetattr(STDIN_FILENO, &org_opts);
        assert(res==0);
        //---- set new terminal parms --------
        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();
        //------  restore old settings ---------
        res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);assert(res==0);
        return c;
}
/*
int main(){

	inputPassword();
	printf(getpassword());
	return 0;
}*/

把它作为头文件放到工程内部,直接函数调用即可。

PS:代码为二次加工。

comments powered by Disqus