【问题标题】:Change only one letter in string仅更改字符串中的一个字母
【发布时间】:2017-06-03 17:38:57
【问题描述】:

我有 2 个字符串和一个字母。

selectedWords BYTE "BICYCLE"
guessWords BYTE "-------"
inputLetter BYTE 'C'

基于this answers,我编写代码来判断 selectedWords 是否有字母 C,如果是这种情况,他需要更改字符串 guessWords:

猜词“--C-C--”

但是出于某种奇怪的原因,我得到了所有其他可能性,只是不正确。关于如何解决这个问题的一些建议。

【问题讨论】:

  • 顺便说一句,对于hangman,您还可以使用不同的方法,获得字母大小的布尔数组,记住已经猜到了哪个字符。然后在输出当前已知的单词部分时,您可以逐个字母地遍历“选定的单词”,然后输出'-' 或字母本身,具体取决于字母布尔数组的状态。所以你根本不需要“猜词”。在这样的格式化输出之后,你可以保持计数器显示有多少个字母为'-',这样你就可以用它来决定是否需要猜测更多的字母,或者单词是否完整。

标签: arrays string assembly masm irvine32


【解决方案1】:

首先,忘记所谓的字符串指令(scas、comps、movs)。其次,您需要一个带有索引的固定指针(dispkacement),例如[esi+ebx]。您是否考虑过 WriteString 需要一个以空字符结尾的字符串?

INCLUDE Irvine32.inc

.DATA
selectedWords BYTE "BICYCLE"
guessWords BYTE SIZEOF selectedWords DUP ('-'), 0   ; With null-termination for WriteString
inputLetter BYTE 'C'

.CODE
main PROC

    mov esi, offset selectedWords       ; Source
    mov edi, offset guessWords          ; Destination
    mov ecx, LENGTHOF selectedWords     ; Number of bytes to check
    mov al, inputLetter                 ; Search for that character
    xor ebx, ebx                        ; Index EBX = 0

    ride_hard_loop:
    cmp [esi+ebx], al                   ; Compare memory/register
    jne @F                              ; Skip next line if no match
    mov [edi+ebx], al                   ; Hang 'em lower
    @@:
    inc ebx                             ; Increment pointer
    dec ecx                             ; Decrement counter
    jne ride_hard_loop                  ; Jump if ECX != 0

    mov edx, edi
    call WriteString                    ; Irvine32: Write a null-terminated string pointed to by EDX
    exit                                ; Irvine32: ExitProcess

main ENDP

END main

【讨论】:

  • 非常感谢。你解决了我在项目中遇到的所有主要问题。当我完成项目时,我会将他发布在 git 上,并为此撰写论文。所以我决定把我的论文献给你..非常感谢你.. :)
  • @SakaSerbia:谢谢,我感到很荣幸。但你不需要这样做。宁可喝一大杯Šljivovica 对我的健康有益。 :-)
  • 我在我的项目中获得了最大的收益。十分感谢。这是 git github.com/SakaSerbia/Hangman---Visual-Studio-2015-with-Irvine 上的代码
猜你喜欢
  • 2016-05-09
  • 2015-04-20
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多