Linux C : 登录密码星号 * 显示,包含能回退 backspace

来源:互联网 发布:对称矩阵 特征向量 编辑:程序博客网 时间:2024/05/22 10:43

在linux 下需要登录的一个小程序,不明文显示密码,而用星号*代替,并能让用户能回退。。。

网上差了些相关资料,特此总结下。。。。。。。

////////////////////          lee.h        //////////////////////////// 需要包含的头文件 lee.h

#ifndef _LEE_H_         //Linux platform
#define _LEE_H_
#include <termio.h>
#ifndef STDIN_FILENO
#define STDIN_FILENO 0
#endif
int getch(void)
{
        struct termios tm, tm_old;
        int fd = STDIN_FILENO, c;
        if(tcgetattr(fd, &tm) < 0)
                return -1;
        tm_old = tm;
        cfmakeraw(&tm);
        if(tcsetattr(fd, TCSANOW, &tm) < 0)
                return -1;
        c = fgetc(stdin);
        if(tcsetattr(fd, TCSANOW, &tm_old) < 0)
                return -1;
        return c;
}
#else                            //WIN32 platform
#include <conio.h>
#endif

//------------------------------------------分割符-------------------------------------------------------------------------------------

//test.c

#include "lee.h"

#include ……//你自己的头文件

#define BACESPACE 127

#define ALARM 7

#define maxline 200

void get__pwd(char *buffer)    //get  pass word,putchar '*',replace of every char user input

{
    int i=0;
    char letter;
    char ch=getchar();
    while(( i < maxline ) && (letter != '\r' ))
    {
        letter = getch();
        if(letter==BACKSPACE)    //when backspace
        {    
            if(i>0)
            {
                buffer[i--]='\0';
              //      putchar(BACKSPACE);
                putchar('\b');
                putchar(' ');
               //     putchar(BACKSPACE);
                putchar('\b');

                continue;
            }
            else putchar(7);    //alarm
        }
        else if( letter != '\r')
        {
            buffer[i++]=letter;
               putchar('*');
        }
    }

    buffer[i]='\0';

}

标红,注意的点:

1. BACKSPCE的ascii 码是跟终端属性有关的,对于ubuntu而言 ,打开终端的配置属性,找到兼容性选项,对于BACKSPACE,设为Ascii DEL ,则此时为127

2. 之前putchar(BACKSPACE)总是把0x7f给输出来了,达不到预期效果,改为putchar('\b') 就可以了

原创粉丝点击