Ciao a tutti sto cercando di risolvere un problema; devo trovare la parola più lunga in una frase e stamparla, ma nel codice che ho fatto mi stampa solo la prima parola. Il codice ha una parte in C e il blocco __asm. Immagino di dover controllare ogni carattere e aumentare ecx ad ogni lettera e bloccarlo nel momento in cui trovo un segno di punteggiatura o uno spazio.
Solo non riesco a capire come confrontare le varie lunghezze e memorizzare la parola in ‘parolaMax’.
#include <stdio.h>
#include <string.h>
void main()
{
#define MAX_LEN 100
char frase[MAX_LEN] = "Cantami o diva del pelide Achille";
char parolaMax[MAX_LEN + 1];
__asm
{
xor esi, esi; ESI conterrà l'indirizzo della stringa
xor ecx, ecx; ECX conterrà la lunghezza della parola
xor edx, edx; EDX conterrà la lunghezza massima trovata
lea esi, frase
// Ciclo per trovare la parola più lunga
ciclo :
mov al, [esi]; Carica il carattere corrente nella parola
cmp al, 0; Controlla se siamo arrivati alla fine della stringa
je fine; Se si, salta alla fine
cmp al, ' '; Controlla se il carattere è uno spazio
je spazio; Se si, salta alla gestione dello spazio
cmp al, '.'; Controlla se il carattere è un punto
je spazio; Se si, salta alla gestione dello spazio
cmp al, ','; Controlla se il carattere è una virgola
je spazio; Se si, salta alla gestione dello spazio
cmp al, ';'; Controlla se il carattere è un punto e virgola
je spazio; Se si, salta alla gestione dello spazio
cmp al, ':'; Controlla se il carattere è due punti
je spazio; Se si, salta alla gestione dello spazio
cmp al, '\''; Controlla se il carattere è un apostrofo
je spazio; Se si, salta alla gestione dello spazio
cmp al, '?'; Controlla se il carattere è un punto interrogativo
je spazio; Se si, salta alla gestione dello spazio
jmp carattere; Se non è uno spazio o un segno di punteggiatura, salta al controllo del carattere
spazio :
mov byte ptr[parolaMax + ecx], 0; Termina la parola corrente
cmp edx, ecx; Confronta la lunghezza attuale con la lunghezza massima trovata
jge no_aggiornamento; Se la lunghezza attuale è minore o uguale alla lunghezza massima, salta all'aggiornamento della parola più lunga
mov edx, ecx; Aggiorna la lunghezza massima trovata
lea esi, parolaMax; Aggiorna l'indirizzo della parola più lunga
jmp aggiorna_parola; Salta all'aggiornamento della parola più lunga
carattere:
mov byte ptr[parolaMax + ecx], al; Salva il carattere nella parola corrente
inc ecx; Incrementa la lunghezza della parola
jmp prossimo_carattere; Salta al prossimo carattere
prossimo_carattere :
inc esi; Passa al prossimo carattere nella frase
jmp ciclo
no_aggiornamento :
cmp ecx, edx; Confronta la lunghezza attuale con la lunghezza massima trovata
jge ciclo; Se la lunghezza attuale è maggiore o uguale alla lunghezza massima, ritorna al ciclo principale
jmp aggiorna_parola; Salta all'aggiornamento della parola più corta
aggiorna_parola:
mov[parolaMax + edx], 0; Termina la parola più lunga
fine :
}
// Stampa su video
printf("%s\n%s\n", frase, parolaMax);
}