10/06/12 13:31
JErikaM
ciao a tutti mi trovo oggi alle prese con un esercizio di assembler..trovare le occorrenze di una sottostringa...
stringa: ciao ciao ciak
sottostringa: ciao
devo quindi trovare quante volte c'è ciao nella stringa e stampare a video gli indici in cui si trova la parola
(esempio sopra..ciao la trovo all'indice 0 e 5
questo è il mio codice che a volte stampa giusto: o la parola è la prima, o è dopo una parola sbagliata
stampa invece indirizzi strani di memoria negli altri casi...
non posso modificare il codice C... concettualmente mi pare che il ragionento cia sia tutto..ovvero...
controllo il contenuto degli indici delle due stringhe, se sono uguali contropllo che vi sia tutta la parola e in quel caso mi segno l'occorrenza memorizzandone l'indice..se invece le due lettere sono diverse proseguo nella stringa principale ma ricomincio con la sottostringa...
potete aiutarmi? :/ grazie in anticipo!
stringa: ciao ciao ciak
sottostringa: ciao
devo quindi trovare quante volte c'è ciao nella stringa e stampare a video gli indici in cui si trova la parola
(esempio sopra..ciao la trovo all'indice 0 e 5
questo è il mio codice che a volte stampa giusto: o la parola è la prima, o è dopo una parola sbagliata
stampa invece indirizzi strani di memoria negli altri casi...
#include <stdio.h> void main() { #define MAX_LEN 100 //INPUT char s1[] = "ciak ciak"; //prima stringa unsigned int lungS1 = sizeof(s1)-1; char s2[] = "ciao"; //seconda stringa unsigned int lungS2 = sizeof(s2)-1; //OUTPUT unsigned int posizioni[MAX_LEN]; unsigned int posizioniLen; _asm { XOR EAX,EAX //contiene il primo indice s1[ECX] XOR EBX,EBX //è var temporanea che contiene l'indice da mettere se c'è l'occorrenza XOR ECX,ECX XOR EDX,EDX XOR ESI,ESI //num occorrenze XOR EDI,EDI //MOV EDI,lungS2 //DEC EDI ciclo1: MOV AL,s1[ECX] //sposto l'indice della stringa MOV EBX,ECX //ci sposto l'indice nche userò se trovo l'occorrenza CMP AL,s2[EDX] //controllo il contenuto del primo indice di entrambe le stringhe JNE nonuguali uguali: INC ECX //incremento gli indici delle due stringhe INC EDX MOV AL,s1[ECX] //sposto l'indice della stringa CMP AL,s2[EDX] //controllo il contenuto dell'indice di entrambe le stringhe JNE nonuguali INC EDX CMP EDX,lungS2 JE occorrenza DEC EDX JNE uguali occorrenza: MOV posizioni[ESI],EBX //sposto l'indice in cui si trova l'occorrenza nel vettore INC ESI //incremento solo ora il numero delle occorrenze in modo da mettere EBX nella cella giusta nonuguali: INC ECX CMP lungS1,ECX //confronto la lunghezza della sottostringa con il proprio indice JE fine //DEC ECX //INC ECX //incremento indice stringa XOR EDX,EDX //azzero l'indice della sottostringa per ripartire a controllare JMP ciclo1 fine: MOV posizioniLen,ESI //num occorrenze } { unsigned int i; for (i=0;i<posizioniLen;i++) printf("sottostringa in posizione-%d\n",posizioni[i]); } }
non posso modificare il codice C... concettualmente mi pare che il ragionento cia sia tutto..ovvero...
controllo il contenuto degli indici delle due stringhe, se sono uguali contropllo che vi sia tutta la parola e in quel caso mi segno l'occorrenza memorizzandone l'indice..se invece le due lettere sono diverse proseguo nella stringa principale ma ricomincio con la sottostringa...
potete aiutarmi? :/ grazie in anticipo!
Ultima modifica effettuata da JErikaM 10/06/12 15:43
aaa