ورود

View Full Version : جستجو رشته درون رشته دیگر



mamad64bit
دوشنبه 29 تیر 1388, 14:44 عصر
سلام دوستان
چطور میتونم یک رشته درون رشته دیگر سرچ کنم
من به کد نیازی ندارم اگر روش کلی رو هم بگید خیلی ممنون میشم

kiuhnmgtrdcv
دوشنبه 29 تیر 1388, 15:31 عصر
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } سلام دوست من
میخواهیم source را در target جستجو کنیم
برای این کار باید اول از همه مقایسه کاراکتر به کاراکتر از source به target داشته باشیم
خوب چک میکنیم که ایا کاراکتر اول source برابر با target یا نه
اگر اری پس کاراکتر source را یکی میبریم جلو و با کاراکتر بعدی target مقایسه میکنیم اگر نه هم که فقط به کاراکتر target اضافه میکنیم من اینجا سورسشو نوشتم فکر میکنم این بهتر از من توضیح میده!


l1: cmp [si],[di]
jne l3
inc si
inc di
cmp si,lenOfsource
je exit
jmp l1
l3:
inc di
lea si,source
jmp l1

mortezamsp
دوشنبه 29 تیر 1388, 18:29 عصر
باسلام.

منم با همین روش موافقم.

این کدی که نوشتم میاد رشته str2 رو تو تو رشته str1 جستجو میکنه و اگه پیداش کرد اونو با رشته str3 که هم طول با str2 هستش جایگزین میکنه:

;================================================= ========================
find_match macro
local lea1,lea2
local first_match,continue,cn2,cn3,end1


lea si,str1
mov cl,last_found ;si must point to [str1+last_found]
mov ch,0
lea1:
inc si
loop lea1

lea di,str2
inc di


;first match
first_match:
mov al,[si]
mov ah,[di]
cmp al,[di]
je continue
inc last_found
inc si
cmp [si],'$'
jne first_match
jmp end1

;other matches
continue:
push di
push si
cn2: ;
inc si ;
cmp [si],'$' ;
je end1 ;it means complete match ;
inc di ;
cmp [di],'$' ;
je end1 ;~~ ;
mov al,[si] ;
cmp al,[di] ;
jne cn3 ;
je cn2 ;
jmp end1 ;
;
cn3: ;
pop si
pop di
inc si
jmp first_match

;complete matches found
end1:
push si


endm
;----------------------
swap_strs macro
local swap,lea1


pop si
;si must come back to first match found
; .now its on end
mov ch,0
mov cl,str2
lea1:
dec si
loop lea1

lea di,str3


swap:
mov al,[di]
mov [si],al
inc si
inc di
cmp [di],'$'
jne swap



endm
;---------------------
print macro string

inc row
mov dh,row
mov al,0
mov bh,0
mov ah,2
int 10h

mov ah,09h
mov dx,offset string
int 21h
endm
;================================================= ========================
data segment
;================================================= ========================
str1 db 66,'swap string2 & string3 on string1.just string2 .ok?$$$'
str2 db 7,'string2$'
str3 db '<newst>$'
last_found db 1
row db 0 ;for printing
;================================================= ========================
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

;================================================= ========================
;========================================== code segment===============
;================================================= ========================
print str1
begin:
find_match
swap_strs
print str1

end_:
;================================================= ========================
;================================================= ========================
;================================================= ========================
; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.

banshee
پنج شنبه 11 شهریور 1389, 17:12 عصر
باسلام.

منم با همین روش موافقم.

این کدی که نوشتم میاد رشته str2 رو تو تو رشته str1 جستجو میکنه و اگه پیداش کرد اونو با رشته str3 که هم طول با str2 هستش جایگزین میکنه:

;================================================= ========================
find_match macro
local lea1,lea2
local first_match,continue,cn2,cn3,end1


lea si,str1
mov cl,last_found ;si must point to [str1+last_found]
mov ch,0
lea1:
inc si
loop lea1

lea di,str2
inc di


;first match
first_match:
mov al,[si]
mov ah,[di]
cmp al,[di]
je continue
inc last_found
inc si
cmp [si],'$'
jne first_match
jmp end1

;other matches
continue:
push di
push si
cn2: ;
inc si ;
cmp [si],'$' ;
je end1 ;it means complete match ;
inc di ;
cmp [di],'$' ;
je end1 ;~~ ;
mov al,[si] ;
cmp al,[di] ;
jne cn3 ;
je cn2 ;
jmp end1 ;
;
cn3: ;
pop si
pop di
inc si
jmp first_match

;complete matches found
end1:
push si


endm
;----------------------
swap_strs macro
local swap,lea1


pop si
;si must come back to first match found
; .now its on end
mov ch,0
mov cl,str2
lea1:
dec si
loop lea1

lea di,str3


swap:
mov al,[di]
mov [si],al
inc si
inc di
cmp [di],'$'
jne swap



endm
;---------------------
print macro string

inc row
mov dh,row
mov al,0
mov bh,0
mov ah,2
int 10h

mov ah,09h
mov dx,offset string
int 21h
endm
;================================================= ========================
data segment
;================================================= ========================
str1 db 66,'swap string2 & string3 on string1.just string2 .ok?$$$'
str2 db 7,'string2$'
str3 db '<newst>$'
last_found db 1
row db 0 ;for printing
;================================================= ========================
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

;================================================= ========================
;========================================== code segment===============
;================================================= ========================
print str1
begin:
find_match
swap_strs
print str1

end_:
;================================================= ========================
;================================================= ========================
;================================================= ========================
; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.



ممنون از برنامه
حالا اگه طولشون یکی نباشه چی؟
برای شمردن تعداد تکرار رشته 2 در رشته 1 چی کار باید کرد؟
اگه چندتا رشته 2 داخل رشته 1 باشه همشون رو جایگزین نمیکنه
اگه پیشرفته تر بزاری ممنون میشم
مرسی