C语言输入密码时的回显处理

来源:互联网 发布:软件测试薪资 编辑:程序博客网 时间:2024/06/14 07:43

C语言输入密码时的回显处理

之前在写一个C语言的项目的时候,需要一个登陆界面。然而直接输入密码的时候会有回显,于是就百度到了getch(),正好现在在看C语言进阶,再整理一下:

  • getch()
  • getche()
  • sprintf()
  • 输入密码无回显
  • 输入密码回显‘*’

函数功能比较

1、getchar()是从键盘的文件缓冲区读取字符,当从键盘输入字符时,可以输入若干个字符(但是它只读取一个),并且最后一定要回车确认。而getch()和getche()是直接从简繁读取(不经过文件缓冲区),输入时只要按下一个键(任意键,也可以是回车键),不需要回车确认,程序就能继续运行了。
2、用getchar()读取字符时,若键盘输入回车,则读取的字符时换行符’\n’(送入缓冲区时被转换,回车总是被转换为换行符再送入缓冲区);而用getch()或getche()读取字符时,若键盘输入回车,则读取的字符是回车符’\r’(不经过缓冲区所以未被转换,不同系统有区别)。
3、getch()和getche()也有不同:前者对输入没有回显,既屏幕上不出现输入的字符,可以用来输入密码;而后者有回显。

getch()

1、头文件:conio.h(不是C标准库中的文件,是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作)
2、函数原型:int getch(void)
3、返回值:读取的字符
4、易错点:

(1)并非标准函数,要注意移植性
(2)所在头文件是conio.h,而不是stdio.h
(3)在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数
也会返回的情况。
(4)在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)
1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。
2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。

getch()

输入后立即从控制台取字符
1、头文件:conio.h
2、函数原型:int getche(void)
3、返回值:输入字符对应的ASCII码

sprintf()

字符串格式化命令,主要功能是把格式化的数据写入某个字符串中
1、头文件:stdio.h
2、函数原型:int sprintf( char *buffer, const char *format, [ argument] … );

buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]…:可选参数,可以是任何类型的数据**

3、返回值:返回写入buffer 的字符数,出错则返回-1. 如果 buffer 或 format 是空指针,且不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。
同时buffer的内容将被改变。

sprintf_s和snprintf

sprintf_s()是sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险
int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format [,argument] … );
不过sprintf_s()是微软私有的函数,考虑到跨平台移植,最好使用snprintf()
int _snprintf(char *buffer, size_t count, const char *format [,argument] … );

strftime

专门用于格式化时间字符串
要调用者指定缓冲区的最大长度
例:strftime(s, sizeof(s), “%Y-%m-%d %H:%M:%S”, localtime(&t));

输入密码无回显

#include <stdio.h>#include <conio.h>int main(void){    int i = 0;    char password[25],ch;    printf("Please input password:");    while(1){        ch = getch();        if(ch == '\r')            break;        password[i++] = ch;    }    password[i] = 0;    printf("\nYour password is:%s\n",password);    return 0;}

运行结果

输入密码回显‘*’

#include <stdio.h>#include <conio.h>void in_password(char*,int,int);int main(void){    int min_len = 6, max_len = 16;    char password[25],ch;    printf("Please input password:");    in_password(password, min_len, max_len);    printf("\nYour password is:%s\n", password);    return 0;}void in_password(char *password,int min,int max){    int i;    char ch;    while(1){        i = 0;        while(1){            ch = getch();            if(ch == '\r')                break;            else if(ch == '\b'){                if(i > 0){                    printf("\b \b");                    i--;                }                continue;            }            printf("*");            if(i > max)                break;            password[i++] = ch;        }        password[i] = 0;        if(i < min || i > max)            printf("\nPlease input again:");        else            break;    }}

运行结果

原创粉丝点击