Eccomi qui con un altro problema .-. qui è proprio misero..non ha senso
in questo programma devo cercare le occorrenze della stringa 2 nella stringa 1
il programma funziona con tutte le stringhe che ho provato...tranne che con
"Sette scettici sceicchi sciocchi con la sciatica a Shanghai"
"icchi"
non capisco perchè..in quanto questa stringa mi pare a concetto uguale a "icchi sceicchi cane sceicchi cane icchi icchi icchi icchi cane" con la quale il programma funziona correttamente o.o
non riesco a trovare l'errore!!
Help ç_çe grazie ancora!codice:#include <stdio.h> void main() { #define MAX_LEN 100 //INPUT char s1[] = "icchi sceicchi cane sceicchi cane icchi icchi icchi icchi cane"; //prima stringa unsigned int lungS1 = sizeof(s1)-1; char s2[] = "icchi"; //seconda stringa unsigned int lungS2 = sizeof(s2)-1; //OUTPUT unsigned int posizioni[MAX_LEN]; unsigned int posizioniLen; _asm { //azzeramento registri 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 //per scorrere s1 XOR EDX,EDX //per scorrere s2 XOR ESI,ESI //num occorrenze XOR EDI,EDI //lo uso per la lunghezza //se s1<s2 termino il programma perchè non ho occorrenze MOV EDI,lungS1 CMP EDI,lungS2 JB fine ciclo1: MOV AL,s1[ECX] //sposto l'indice della stringa in AL (8bit) MOV EBX,ECX //ci sposto l'indice che userò se trovo l'occorrenza (sarà l'indice che visualizzo nella stampa) 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 per scorrerle INC EDX MOV AL,s1[ECX] //sposto l'indice della stringa in AL (8bit) CMP AL,s2[EDX] //controllo il contenuto dell'indice di entrambe le stringhe JNE nonuguali INC EDX //incremento EDX per controllare se sono arrivata alla fine del vettore CMP EDX,lungS2 //confronto l'indice con la lunghezza si s2, se sono uguali ho terminato di scorrere JE occorrenza DEC EDX //decremento EDX siccome prima l'avevo incrementata JNE uguali occorrenza: MOV posizioni[ESI*4],EBX //sposto l'indice in cui si trova l'occorrenza nel vettore. è *4 siccome un unsigned int è 4byte INC ESI //incremento solo ora il numero delle occorrenze in modo da mettere EBX nella cella giusta XOR EDX,EDX JMP nonuguali2 nonuguali: XOR EDX,EDX CMP AL,s2[0] //nel caso in cui le due lettere sono diverse faccio questo controllo che controlla che la lettera in questione sia uguale alla prima della parola da cercare...così se mi trovo nel caso "sceicchi" e devo cercare "icchi", quando controllo la i che è diversa dalla mia h, vedo però che è uguale alla i della s2 quindi riparto col procedimento di controllo solito JE ciclo1 nonuguali2: INC ECX //incremento l'indice della stringa principale CMP lungS1,ECX //confronto la lunghezza della sottostringa con il proprio indice, se sono uguali significa che ho finito tutta la stringa dove cercare le occorrenze JE fine XOR EDX,EDX //azzero l'indice della sottostringa per ripartire a controllare JMP ciclo1 fine: MOV posizioniLen,ESI //num occorrenze trovate } { unsigned int i; for (i=0;i<posizioniLen;i++) printf("sottostringa in posizione-%d\n",posizioni[i]); } }

Rispondi quotando
grazie mille 
