You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:15:04