2016-04-19 1 views
3

私はこのような入力を持っている:文字列のすべての句読点とスペースを削除するにはどうすればよいですか?

これで、,,, * &%のA ::;デモ+文字列。 +必要があります** @!///形式::::: !!!必要なthis.`

出力:私はstr_trimを使用してせずにこのをしなければならない

ThisisademoStringNeedtoformatthis

編集:暗号化プログラムを作成しています。私はそれを暗号化する前に、文字列からすべての句読点を削除し、すべての小文字を大文字にする必要があります。

コードを追加しました。私は大文字にする前にスペースや句読点を削除する必要があります。これまで私は私の本で、私たちが使うことが許されていないstr_trimを除いてこれを助けることのできるものは見つけられませんでした。

INCLUDE Irvine32.inc 

.data 
source byte "This is the source string",0 

.code 
main proc 


mov esi,0    ; index register 
mov ecx,SIZEOF source ; loop counter 
L1: 
mov al,source[esi]  ; get a character from source 
and source[esi], 11011111b  ; convert lower case to upper case 
inc esi    ; move to next character 
loop L1     ; repeat for entire string 

mov edx, OFFSET source 
call WriteString 

exit 
main endp 
end main 
+0

親愛なる@masuchiuraさん、あなたのコードを投稿してください。あなたのコードを修正して改善することができます。 –

+0

私は暗号化プログラムを書いています。私はそれを暗号化する前に、文字列からすべての句読点を削除し、すべての小文字を大文字にする必要があります。 –

+0

@JoseManuelAbarcaRodríguez私は今コードを追加しました。大文字にする前にスペース/句読点をすべて削除しなければなりません。 –

答えて

2

あなたは既に小文字から大文字に変更しようとしていますので、私は句読点を削除する手を差し上げます。次のコードでは、大文字を句読点文字を無視した補助文字列に移動するという私の提案を使用しています。私はEMU8086コンパイラを使用:

.stack 100h 
.data 
source db "STRING, WITH. PUNCTUATION : AND * SPACES!$" 
aux  db "           " 
.code 
    mov ax, @data 
    mov ds, ax 

;REMOVE EVERYTHING BUT UPPERCASE LETTERS. 

    mov si, offset source ; POINT TO STRING. 
    mov di, offset aux  ; POINT TO AUXILIARY. 
L1: 
    mov al, [ si ]   ; get character from source 
;CHECK IF END STRING ($). 
    cmp al, '$' 
    je finale 
;CHECK IF CHAR IS UPPERCASE LETTER. 
    cmp al, 65 
    jb is_not_a_letter ; CHAR IS LOWER THAN 'A'. 
    cmp al, 90 
    ja is_not_a_letter ; CHAR IS HIGHER THAN 'Z'. 
;COPY LETTER TO AUX STRING. 
    mov [ di ], al 
    inc di    ; POSITION FOR NEXT CHARACTER. 
is_not_a_letter: 
    inc si    ; move to next character 
    jmp L1 

finale: 
    mov [ di ], al  ; '$', NECESSARY TO PRINT. 

;PRINT STRING. 
    mov dx, OFFSET aux 
    mov ah, 9 
    int 21h 

;END PROGRAM. 
    mov ax, 4c00h 
    int 21h    

私はint 21hで文字列を出力するので、私は「$」を持つ文字列を終了します。

ご覧のとおり、私はCXもLOOP命令も使用していません。私がしているのは、 '$'が見つかるまで繰り返すことです。 0が見つかるまで同じことができます。

1

これはすべての句読点を削除して大文字に変換した後のコードです。

INCLUDE Irvine32.inc 

.data 
source byte "STriNG, @# WITH.[][][ lalalala PUncTuATION : AND * SpaceS!", 0 
target byte SIZEOF source DUP(0), 0           

.code 
main PROC 

    pushad 

    mov edx, offset source 
    call WriteString 
    call CrlF 
    mov edx, 0 

    mov esi, offset source 
    mov edi, offset target  
L1: 
    mov al, [ esi ]   ; get character from source 

    cmp al, 0 
    je final 

    cmp al, 65 
    jb not_letter ; if char is lower than 'A' jump to not letter 
    cmp al, 122 
    ja not_letter  ; if char is greater than 'z' jump to not letter 

    cmp al, 90 
    ja Label1   ; jump if above 'Z' 
    jmp next   ; false 
    Label1: 
    cmp al, 97 
    jl Label2   ; jmp if less than 'a' 
    jmp next   ; false 
    Label2:    ; if both are true than is greater than 'Z' but less than 'a' 
    jmp not_letter  ; jump to not letter 

    next: 
    mov [ edi ], al 
    inc di    ; position to next character. 

    not_letter: 
    inc si    ; move to next character 
    jmp L1 

    final: 
    mov [ edi ], al  

    mov edx, OFFSET target 
    mov ah, 9 
    call WriteString 
    call CrlF 

    mov esi,0    ; index register 
    mov ecx,SIZEOF source ; loop counter 
    L2: 
    mov al, target[esi]  ; get a character from source 
    and target[esi], 11011111b  ; convert lower case to upper case 
    inc esi    ; move to next character 
    loop L2     ; repeat for entire string 

    mov edx, OFFSET target 
    call WriteString 
    call CrlF 

    popad 

    exit 
    main endp 
    end main 
関連する問題