使用COBOL SECURE子句实现密码掩码时出现显示异常求助
OpenCOBOL中SECURE子句导致显示异常的解决方法
问题描述
开发登录系统时,原本登录功能正常。使用SECURE子句实现密码输入掩码(星号隐藏输入)后,输入过程正常,但按下回车后出现显示异常:
- 成功提示
Login successful! proceeding to main system...显示为_ogin successful! proceeding to main system...(缺失首字母L) - 再次输入时,提示文本
ENTER YOUR CHOICE (1-3):显示为0NTER YOUR CHOICE (1-3): *****************
移除SECURE子句后问题消失,但需要保留密码掩码功能。使用OpenCOBOL,遵循COBOL 85和X/Open COBOL标准,在COBOL2014环境下问题依然存在。
原因分析
OpenCOBOL的SECURE子句在处理密码输入时,可能未正确清理终端输入缓冲区的残留字符(如回车符遗留),或与终端字符回显机制存在兼容性问题,导致后续DISPLAY输出出现字符错位、乱码。
解决方案
方案1:手动实现密码掩码输入(替代SECURE子句)
通过手动读取每个输入字符、显示星号并屏蔽原字符,避免依赖SECURE子句的兼容性问题。
步骤1:添加变量到WORKING-STORAGE SECTION
77 WS-CHAR PIC X VALUE SPACE. 77 WS-PWD-LENGTH PIC 9(2) VALUE 0.
步骤2:替换原SECURE ACCEPT代码
以USER-LOGIN段落中的密码输入为例,替换:
DISPLAY "ENTER PASSWORD (or type < to go back): " WITH NO ADVANCING ACCEPT WS-PASSWORD SECURE
为:
DISPLAY "ENTER PASSWORD (or type < to go back): " WITH NO ADVANCING MOVE SPACES TO WS-PASSWORD MOVE 0 TO WS-PWD-LENGTH PERFORM UNTIL WS-CHAR = X'0D' OR WS-PWD-LENGTH >= 20 ACCEPT WS-CHAR WITHOUT ADVANCING * 处理退格键 IF WS-CHAR = X'08' AND WS-PWD-LENGTH > 0 SUBTRACT 1 FROM WS-PWD-LENGTH MOVE SPACE TO WS-PASSWORD(WS-PWD-LENGTH + 1:1) DISPLAY X'08' WITH NO ADVANCING *> 光标左移 DISPLAY SPACE WITH NO ADVANCING *> 覆盖原星号 DISPLAY X'08' WITH NO ADVANCING *> 光标再左移 * 处理正常输入字符 ELSE IF WS-CHAR NOT = X'0D' AND WS-CHAR NOT = X'08' ADD 1 TO WS-PWD-LENGTH MOVE WS-CHAR TO WS-PASSWORD(WS-PWD-LENGTH:1) DISPLAY "*" WITH NO ADVANCING END-IF END-PERFORM DISPLAY SPACE *> 换行
方案2:清理输入缓冲区(适配SECURE子句)
若坚持使用SECURE子句,可在ACCEPT后手动清理缓冲区残留字符,避免影响后续显示:
步骤1:添加变量到WORKING-STORAGE SECTION
77 WS-CHAR PIC X VALUE SPACE.
步骤2:在SECURE ACCEPT后添加清理代码
ACCEPT WS-PASSWORD SECURE * 清理缓冲区残留的回车或多余字符 PERFORM UNTIL WS-CHAR = X'0D' ACCEPT WS-CHAR WITHOUT ADVANCING END-PERFORM
方案3:调整终端设置(类Unix系统)
确保终端处于正确行模式,避免字符回显干扰。可在程序启动和结束时调用系统命令:
* 程序启动时关闭回显 CALL "SYSTEM" USING BY CONTENT "stty -echo" * 程序结束前恢复回显 CALL "SYSTEM" USING BY CONTENT "stty echo"
内容的提问来源于stack exchange,提问作者GOJO-SATURO
相关产品推荐
相关产品推荐

