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;
}
}