先贴聊天记录一部分:
<zimpha#************> 2015-07-26 18:51:25
C题是我那个大四的final队友出的题....描述不清...坑人无数
<zimpha#************> 18:54:43
现在内部题库里面已经没啥可用的题了..于是就挂出了这些恶心题
……说恶心,也没办法,硬着头皮做。
反正任务很简单,就是,翻译扫描码并做相应操作。
(扫描码的工作机制的话,就是每个按键有2个码,一个通码Make Code一个断码Break Code,按下的时候发一个通码,松开的时候发一个断码,具体机制可以参见《自己动手写操作系统》一书,自己用汇编+C语言写一个能处理键盘输入的,DOS味十足的底层程序,当然这不是这里的重点)
其他按键都还好了,只有4个特殊按键需要照顾:左右Shift、Caps Lock、Backspace。
然后他们怎么样的工作机制?!题目一句话都没说!!!!!!
题目居然忘了说明白这个看起来小但完全能影响结果的事情了!!!!!!
更糟糕的是,这些按键的组合行为在不同系统,不同编辑器下行为完全不同!
比如:
- 大写锁关闭,按住CapsLock,然后打英文字母,Win下打出来的是大写字母,Mac下打出来的是小写字母!
- 按住Shift,然后按Tab,Windows的记事本下还是会输出一个制表符( ' \t ' ),但是在Linux的gedit、Win的代码编辑器下,是撤销了缩进(删除一个制表符)!
- 你按下Backspace的时候要我输出\b(ASCII 8,表Backspace)还是删去一个字符?
搞不清楚的细节问题太多了,想发 Clarification 问一下却不行,无力吐槽……
好吧,我们就按照Win下的行为写:
- 按下CapsLock时,大写锁状态翻转,在按下期间CapsLock的状态不变(不管发了多少Make Code),直到松开后再次按下
- 2个Shift互不干扰,CapsLock关闭的情况下,只要按下任何一个Shift,小写边大写,有2个字符的按键则打上面那个字符。两个Shift都按下的情况同理
- CapsLock打开的情况下,按下任何一个Shift,按字母按键,输出小写字母,有2个字符的按键还是打上面那个字符。
- 按住Shift和不按住Shift的时候按Tab,行为一致,输出一个 ' \t &