用户输入密码时,希望把密码隐藏,比如替换为星号*
思路
- 判断用户是否由有键入
- 有则输出一个星号,否则略过
- 如果键入回车字符,终止程序
一些准备工作
- IDE: VC++6.0
- 了解可能用到的特殊函数: getch(),来自conio.h
- 了解需要用到的特殊字符的ASCII码: 8 \b 退格、10 \n 换行、13 \r 回车
开始写代码
- 预处理指令:
# include <stdio.h>
# include <conio.h> //getch()
# define MAX_PW_LEN 16 //密码最大长度
- 主函数:
int main(void)
{
char storePassword[MAX_PW_LEN] = {'\0'}; //存储用户输入的密码
printf("Password: ");
getPassword(storePassword, MAX_PW_LEN); //获取用户输入的密码
printf("\nCheck: %s\n", storePassword); //检验结果
return 0;
}
- 自定义函数getPassword():
//如果把此函数写在main函数后面,记得在main函数前面某行处,加上函数声明!
void getPassword(char * storePw, int maxPwLen)
{
char c = '\0'; //存放用户键入的每个字符
char * pc = storePw; //为方便指向密码字符串中每个字符
int pwlen = 0; //当前password的长度
while(1)
{
c = getch();
//如果用户按下回车符,停止循环
if (c == '\r')
break;
//将用户输入的有效字符存入密码串,不考虑空字符'\0'
if (pwlen >= 0 && pwlen < maxPwLen-1 && c)
{
*pc = c;
pc++;
pwlen++;
putchar('*');
}
}
}
- 编译链接运行:
更多尝试
-
如果输入超多字符:
没反应,因为pwlen >= 0 && pwlen < maxPwLen-1 && c
这里已经限制了有效字符个数 -
如果不小心输入错误,想退格:
在if (c == '\r') break;
后面加上下面那部分
//响应退格, 当心有效字符串的当前长度为0
if (c == '\b')
{
if (pwlen >0)
{
pc--;
pwlen--;
printf("\b \b"); //退格退的是光标,用个空格覆盖,假装撤销打印的星号*
}
continue;
}
扩展
-
考虑一下:
- 获取用户从键盘的输入,用scanf语句,或者函数getchar(),会怎样?
- 如果不用退格的方法,而是用循环打印星号*,会怎么样?
- emmmm,暂时只想到这么多……
-
总结:
- 目标。 用C语言实现一个将其他字符转换为星号*的功能
- 准备工作。 写代码的环境、代码的思路、所需要的C语言相关的知识
- 写查改。 开始撸代码,完成预想的功能
- 完善工作。 尝试一些非法或奇怪的操作,用以测试代码
最后
源代码已上传,
水平不高,可能还有做得不够好的地方,
希望能和大家交流学习,
转载请注明出处。