我正在用MIPS编写一个回文检查器,我试图让它的重音不敏感,这样像"ahà"这样的东西也会被认为是回文。但是,它看起来并不像不区分大小写的情况那么简单,在小写和大写字母之间有一个固定值。
我问我的老师,她说我可以检查整个字符串并将任何"è"替换为"e",然后再次检查以将任何"é"替换为"e"等等,但她告诉我有更好的解决方案,并要求我考虑一下。 到目前为止,我唯一注意到的是重音在扩展的 ASCII 代码中,所以> 127,但我似乎不明白该怎么做。有人可以帮助我吗?即使只是提示也会不胜感激,提前谢谢你。
你将不得不像Alain Merigot建议的那样使用查找表对此进行硬编码。如何执行此操作取决于您的字符串编码方案(ASCII 与 UTF-8 等)
对于ASCII,我对此进行了修改,它应该可以工作:
.data
ascii_strip_accent_table:
# index: U+nnnn offset, minus 128
.space 0x40 ;table doesn't really start until U+00C0
.ascii "AAAAA"
.byte 0xC6
.ascii "C"
.ascii "EEEE"
.ascii "IIII"
.ascii "D"
.ascii "N"
.ascii "OOOOO" ;these are capital Os, not zeroes
.byte 0xD7
.ascii "O" ;this is a capital O, not a zero
.ascii "UUUU"
.ascii "Y"
.byte 0xDE,0xDF
.ascii "aaaaa"
.byte 0xE6
.ascii "c"
.ascii "eeee"
.ascii "iiii"
.ascii "d"
.ascii "n"
.ascii "ooooo"
.byte 0xF7
.ascii "o"
.ascii "uuuu"
.ascii "y"
.byte 0xFE
.ascii "y"
MyString:
.asciiz "Pokémon"
.text
la $a0,ascii_strip_accent_table
la $a1,MyString
li $t2,128
loop:
lbu $t0,($a1) # read from string
beqz $t0,done
bltu $t0,$t2,continue # if char < 128, skip
subu $t0,$t0,$t2 # subtract 128 to get array index
move $a2,$a0 # backup table base
addu $a2,$a2,$t0 # add array index to table base
lbu $t0,($a2) # load from table
sb $t0,($a1) # store in string
continue:
addiu $a0,$a0,1
j loop
done:
li $v0,10
syscall
编辑:现在,如果您像我一样并且无法忍受不必要的填充,如果您la $a0,ascii_strip_accent_table-64
,您实际上可以在开始时删除该.space 40
。你是否愿意冒这个险,取决于你。