我想从MARS中的用户输入中保存某种类型的密码。当用户键入内容时,我希望它显示*
而不是键入的字符。
随着用户的输入,我会将每个字符保存到一个数组中。我已经有了将每个字符保存到缓冲区中的代码,但是我很难弄清楚如何隐藏用户键入的内容。
我该怎么做?
答案 0 :(得分:-1)
据我所知,MARS不可能做到这一点。玩具系统所提供的功能甚至不允许您移动光标位置或启用/禁用终端回波。 / p>
(它确实具有“位图图形”模式,所以我想您可以在读取键盘输入时在该显示器上手绘*
字形。但是它没有在位图中绘制文本的功能。)< / p>
在文本终端上的POSIX中,您可以通过禁用TTY回显并将终端置于原始模式(通过ioctl
系统调用来实现)。
然后,read()
系统调用将在任何输入准备就绪而不是整行时立即返回,因此您将在读取字符后使程序打印*
。 (而且您必须手动支持退格行编辑)。
我在其系统调用列表中看不到MARS支持任何。 http://courses.missouristate.edu/KenVollmar/mars/Help/SyscallHelp.html
您必须添加新的系统调用:http://courses.missouristate.edu/KenVollmar/mars/Help/MarsHelpTools.html介绍了如何编写Java类来处理新的系统调用并将其挂钩到MARS。
SPIM确实具有MMIO access to a "terminal" device,您可以在其中单独读取键盘输入,而不必在屏幕上回显它,但是MARS并没有记录这样的内容。我认为MARS键盘/屏幕我/ O仅可通过系统调用来使用,而文档中所涵盖的完整设置不允许。
看来,打印'\b'
(ASCII退格)字符无法将光标向后移动到用户键入的内容上。您只会得到一个带有黑色轮廓的白框。
如果您是在Linux桌面或MacOS X终端窗口的XTerm(或Gnome-terminal或Konsole)中通过命令行在非GUI模式下运行MARS, 您可以将MARS输出发送到做处理光标移动转义序列和代码的终端。
(我没有尝试过)最后的希望是,如果回车符(\r
)将字符移动到行的开头而不前进到下一行。在这种情况下,您可以通过重新打印整行*
个字符来打印用户键入的内容。
但是,即使这样行之有效,它也可能会按照键入的内容在屏幕上闪烁,至少在程序覆盖它之前会暂时消失。