Domanda Esercizio di ricerca in C

Ledriana

Utente Iron
20 Ottobre 2021
1
1
0
3
Ultima modifica da un moderatore:
Salve, mi è stato assegnato un laboratorio, di cui allego di seguito il testo:

Una espressione regolare (o regexp) è una sequenza di simboli (quindi una stringa) che identifica un
insieme di stringhe. Si scriva una funzione in C in grado di individuare (cercare) eventuali occorrenze di
una data regexp all'interno di una stringa di input.
La funzione sia caratterizzata dal seguente prototipo:

char *cercaRegexp(char *src, char *regexp);
dove :
 il parametro src rappresenta la stringa sorgente in cui cercare.
 il parametro regexp rappresenta l'espressione regolare da cercare.
 il valore di ritorno della funzione è un puntatore alla prima occorrenza di regexp in src (NULL
se non trovata).

Ai fini dell'esercizio si consideri di valutare solamente stringhe composte da caratteri alfabetici. Si
considerino inoltre solamente espressioni regolari composte da caratteri alfabetici e dai seguenti
metacaratteri:
 . trova un singolo carattere (cioè qualunque carattere può corrispondere a un punto)
 [] trova un singolo carattere contenuto nelle parentesi (cioè uno qualsiasi dei caratteri tra parentesi
va bene)
 [^ ] trova ogni singolo carattere non contenuto nelle parentesi (cioè tutti i caratteri tra parentesi
non vanno bene)
 \a trova un carattere minuscolo
 \A trova un carattere maiuscolo

Esempi di espressioni regolari:
.oto corrisponde a ogni stringa di quattro caratteri terminante con “oto”, es. "voto", "noto",
"foto", ...
[mn]oto rappresenta solamente "moto" e "noto"
[^f]oto rappresenta tutte le stringhe terminanti in “oto” ad eccezione di "foto"
\aoto rappresenta ogni stringa di quattro caratteri (come "voto", "noto", "foto", ... ) iniziante per
lettere minuscola e terminante in “oto”
\Aoto rappresenta ogni stringa di quattro caratteri (come "Voto", "Noto", "Foto", ...) iniziante per
lettere maiuscola e terminante in “oto”.

Ho cercato di risolverlo con dei costrutti if-else e poi la strstr, ma la funzione mi ritorna sempre NULL. Sto letteralmente impazzendo!
Qualcuno saprebbe abbozzarmi qualche riga di codice?
Io avevo iniziato così:
C:
char *cercaRegexp(char *src, char *regexp) {
    char *ris;
    while (*regexp != '\0') {
        if (*regexp == '.') {
            if (*(regexp + 1) == *src) {
                ris=*(src - 1);
            }
        }
        else if (*regexp == '[') {
            if (*(regexp + 1) == *src) {
                ris=strchr(src, *(regexp+1));
            }

        }
        else if (*regexp == '[' && *(regexp + 1) == '^') {
            if (*(regexp + 2) != *src) {
                ris=*src;
            }
        }
        else if (*regexp == '\\') {

        }
        else
            regexp++;
        return ris;
    }
}
o anche così:
C:
char *cercaRegexp(char *src, char *regexp) {
    char *ris;
        while (*regexp != '\0') {
            if (*regexp == '.') {
                while(*src!='\0'){
                    if(*(regexp+1)==*src){
                        printf("%c", *(src-1));
                        return strstr(src,regexp);
                    }
                    src++;
                }

            } else if (*regexp == '[') {

            } else if (*regexp == '[' && *(regexp + 1) == '^') {

            } else if (*regexp == '\\') {

            }

        }
        regexp++;
        return ris;
    }
Ma credo io non abbia proprio capito concettualmente cosa voglia il programma.
 
Prima di tutto, usa il tag CODE. Capisco che a fare copia e incolla si fa prima, ma ti assicuro che se ti prendi 30 minuti per scrivere un post come come si deve le risposte ci saranno e saranno anche utili e tempestive. Ad un post scritto male passa la voglia di rispondere, soprattutto se è il post di un nuovo utente, con solo un messaggio sul forum e che puntualmente sparirà ad esercizio risolto. Questo rant non è diretto a te in particolare, ma un po' a tutti quanti.

Ma credo io non abbia proprio capito concettualmente cosa voglia il programma.
Il testo dell'esercizio mi sembra chiaro e ben esposto. È un esercizio storico e capisco che di primo impatto possa un po' intimorire visto che non è semplice semplice, però leggendo il testo a me sembra tutto chiaro. Cosa ti sfugge?

Ho cercato di risolverlo con dei costrutti if-else e poi la strstr, ma la funzione mi ritorna sempre NULL. Sto letteralmente impazzendo!
Qualcuno saprebbe abbozzarmi qualche riga di codice?
L'esercizio non è banale, ma non è lungo e per chi è capace non è nemmeno particolarmente tosto. Se ti abbozzo qualche riga di codice va a finire che ti risolvo la parte facile e ti faccio affrontare la parte difficile, è un compromesso poco sensato. Facciamo che provo a guidarti verso la soluzione e mal che vada aggiungo io i pezzi un po' più difficili.

Dimenticati strstr, è un esercizio didattico che si può tranquillamente risolvere senza usare la libreria standard. Visto che sei bloccata, per adesso dimenticati i metacaratteri composti da più di un carattere (\a, \A, [] e [^]). Inizia a risolverlo per espressioni formate da caratteri alfabetici e il punto. Il primo suggerimento che mi sento di darti è di usare due funzioni: cercaRegex per cercare il pattern all'interno della stringa e match (o come ti pare) per controllare (true o false) se la regex appare all'inizio della stringa. La prima richiamerà la seconda funzione per ogni possibile suffisso: prima parte dall'inizio, poi salta il primo carattere, poi salta il secondo, e così via fino all'ultimo.

Se non riesci a fare nemmeno la versione semplificata che ti ho proposto, inizia semplicemente a scrivere che cerca una stringa (soli caratteri alfabetici) all'interno di un altra stringa senza usare strstr o altre funzioni di libreria. Posta le tue soluzioni parziali che poi ti spiego io come modificarle per fare gli step successivi.
 
  • Mi piace
Reazioni: Ledriana