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

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

运行结果

  • 14
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值