在一些程序中,我们经常会见到输入密码时,密码不是明文显示,而是打印星号,这个小DEMO是如何实现?
代码如下:
1 #include<iostream>
2 #include<conio.h>
3 using namespace std;
4
5 int Sub_1()
6 {
7 char szBuffer[20] = {0};
8 cout<<"Input Password:"<<endl;
9 int i = 0;
10 szBuffer[i] = _getch();
11 printf("*");
12 while (szBuffer[i]!='\r')
13 {
14 i++;
15 szBuffer[i] = _getch();
16 printf("*");
17 }
18 cout<<szBuffer<<endl;
19 cout<<endl;
20 }
21
22 int main(){
23 Sub_1();
24 }
如果把两个"printf("*")"都去掉,输入密码时就没有反应,当然这样的用户体验很不好。
其中涉及到几个小知识点:
1、_getch()和getch()及_T()的区别和联系:
getch()和_getch()的作用:从控制台读取一个字符,但不显示在屏幕上。例如ch=getch();程序会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。
getch()和_getch()的作用是一样的,区别在于带下划线_的函数一般是函数库内部的函数,而不带下划线的一般是提供给用户使用的函数。带下划线的目的是为了防止用户定义的函数和函数库的函数重名冲突,所以直接使用也是可以的。
注意:使用时必须引用头文件<conio.h>
而_T("")是一个宏,作用是让你的程序支持Unicode编码。因为Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理像中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。
_T("")宏定义转换,将字符转换成函数参数相符合的类型。如果没有,编译器一般可以自动转换成需要的类型,但是严格一些的编译器就会报错。
注:头文件为<tchar.h>
如果你编译一个程序为ANSI方式,_T实际不起任何作用。
而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。
LPSTR:32bit指针指向一个字符串,每个字符占1字节
LPCSTR:32-bit指针指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定义
L是用来标志一个字符(串)为宽字符(串)
宽字符:wide character,该字符集内每个字符使用相同的位长;
多字节字符:multibyte character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流(stream)所在的环境背景决定。
当你在VS2005以上版本的IDE工作时,可以选择工作于这两种不同的编码方式下,而在Unicode方式下,则要对字符(串)常量前添加L来告诉编译器它是宽字符
2、回车键的ASCII码:0x0d -- 16进制、13 -- 10 进制、'\r' 也可以。