我必须编写一个程序
- 从键盘缓冲区中获取一个字符串并将其放入字符数组中
- 要求删除一个字符
- 从字符数组中删除字符,同时转移其他所有内容
我想用一个堆栈来完成这个。所以这是我的逻辑。
从字符串的末尾开始,将该字符与要删除的字符进行比较。如果不是角色,则将其推入堆栈。如果它是忽略它并继续通过字符串。然后从一开始就把所有东西都放好。
我应该使用一个程序来完成这个。当我逐步完成时,一切似乎都工作正常,直到我尝试离开程序并返回主程序。我相当确定我的程序中的逻辑是问题所在。现在,当我尝试使用字符串“The”并删除 e 时,我得到“he”。
TITLE String Manipulation
INCLUDE Irvine32.inc
.data
prompt byte "Please enter a string to manipulate : ",0
prompt2 byte "Please enter a character to remove: ",0
answerMSG byte "The new string is: ",0
string BYTE 51 DUP (0)
char BYTE ?
byteCount dword ?
.code
main PROC
call clrscr
push eax ;perserve the registers
push ecx
push edx
mov edx, OFFSET prompt ;prints the prompt
call writeString
mov edx, OFFSET string ;moves the register to the first location for the string
mov ecx, SIZEOF string ;Sets the max characters
call readString
mov byteCount,eax ;places actual count into a counting register
call crlf
mov edx, OFFSET prompt2 ;prints the prompt
call writeString
mov edx, OFFSET char
mov ecx, 1
call readString
call clrscr
mov ecx, byteCount
mov edx, OFFSET string
call stringMan
mov edx, OFFSET string
call writeString
pop edx
pop ecx
pop eax
main ENDP
;
stringMan PROC USES eax ecx edx
mov eax,0
L1:
movzx edx , string[ecx]
cmp dl, char
jz L2
push edx
inc eax
L2:
mov string[ecx],0
LOOP L1
mov ecx,eax
mov eax,0
L3:
pop edx
mov byte ptr string[eax],dl
inc eax
loop L3
ret
stringMan ENDP
END main
弄清楚了。
回答:
我没有处理从控制台正确获取角色的问题。我也没有处理 ecx = 0 的情况。这是字符数组的第一个位置。所以我没有比较正确的字符,也没有在必要时将第一个字符推到数组中。我已经通过删除来修复它
mov edx, OFFSET char
mov ecx, 1
call readString
并将其替换为
call readChar
mov char,al
然后在 L1 循环之后添加它。
movzx edx , string[ecx]
cmp dl,char
jz L4
push edx
inc eax
L4:
它现在按设计工作。我只是有一些格式问题需要解决。