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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 02:47:31