如何在LEX编程中将用户输入的字符串显示为星号(*)
实现密码输入显示星号的修改方案
核心思路
你当前使用Lex开发密码校验程序,默认会回显所有输入字符,要实现输入显示星号只需做以下调整:
- 关闭Lex默认回显逻辑,改为手动控制输出内容
- 每匹配到一个输入字符时手动输出星号,同时刷新缓冲区保证星号实时显示
- 补充边界规则处理换行、非法字符等场景
修改后的完整代码
%{ #include <stdio.h> #include <string.h> unsigned int upper=0, lower=0, dig=0, spChar=0, length=0; %} %% [a-z] {lower++; length++; printf("*"); fflush(stdout);} [A-Z] {upper++; length++; printf("*"); fflush(stdout);} [0-9] {dig++; length++; printf("*"); fflush(stdout);} [!@#$%&^*_()+=.,?;:] {spChar++; length++; printf("*"); fflush(stdout);} \n {return 0;} . {length++; printf("*"); fflush(stdout);} %% int yywrap() { return 1; } int main(){ printf("\nEnter your password. Your password should have:\n"); printf("\t1.Minimum 8 characters\n\t2.Atleast 1 uppercase character"); printf("\n\t3.Atleast 1 lowercase character\n\t4. Atleast 1 special character\n\t5. Atleast 1 digit\n"); printf("\nEnter a password:\n"); yylex(); if(length >=8 && upper!=0 && lower!=0 && dig!=0 && spChar!=0){ printf("\nHURRAY!! YOUR PASSWORD IS STRONG\n"); } else{ printf("\nYOUR PASSWORD IS WEAK :( TRY AGAIN!\n"); } return 0; }
关键修改说明
- 新增换行符匹配规则:用户输入完成按回车时直接退出词法分析,不会将回车计入密码长度,也不会输出多余星号
- 所有字符匹配规则中新增
printf("*"); fflush(stdout);,手动输出星号,调用fflush是为了绕过标准输出缓冲区,保证字符输入后立刻显示对应星号 - 新增默认匹配规则,处理你定义的合法字符范围外的输入,同样显示星号但不会计入合法字符计数,保证原校验逻辑正常生效
- 新增
yywrap函数,解决Lex程序编译时的链接报错问题 - 修复原代码校验逻辑bug:将
length>8改为length>=8,符合最小8位密码的要求
可选优化(支持退格删除)
如果需要支持用户按退格键删除已输入的星号,可新增如下规则:
[\b] { if(length > 0) { printf("\b \b"); fflush(stdout); length--; // 若需要同步扣减对应字符类型的计数器,需额外存储历史输入字符,可按需实现 } }
内容的提问来源于stack exchange,提问作者ROSHNI Lingam
相关产品推荐
相关产品推荐

