Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213

    [c] Esercizio string matching

    Ciao ragazzi.
    Sono alle prese con un esercizio sullo string matching.
    Ho scritto il codice solo che non riesco a capire come funzioni siccome alcune volte mi ritrova l'occorrenza e le altre volte no...
    Tipo se scrivo ita mi ritrova la prima occorrenza, se metto Nel non mi ritrova niente...
    Cos'è che non va?
    L'esercizio mi chiede di ricercare la prima occorenza in una stringa senza usare strstr().

    Ecco il codice:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_PAT 10
    
    int src_occorrenza (char testo[], char pattern[]);
    
    int main()
    {
        int i;
        int ch;
        char pattern[MAX_PAT];
        char testo[] =  "Nel mezzo del cammin di nostra vita\n"
                        "Mi ritrovai per una selva oscura\n"
                        "Che la diritta via era smarrita\n";
        printf("Programmazione II - Esercizio 24\n\n");
        printf("\t***TESTO***\n");
        printf("%s\n\n", testo);
    
        printf("Inserisci il pattern che vuoi ricercare nel testo\n");
        gets(pattern);
    
        ch = src_occorrenza(testo, pattern);
    
        if(ch == -1)
        {
            printf("\nNon e' stato trovata nessuna occorrenza nel testo con il pattern immesso\n");
        } else
        {
            printf("\nIl tuo pattern %s coincide con\n", pattern);
            for(i=0;i<strlen(pattern);i++)
            {
                printf("%c(posizione %d)\n", testo[ch+i], ch+i);
            }
        }
        return 0;
    }
    int src_occorrenza (char testo[], char pattern[])
    {
        int len_p, len_t;
        int it=0,ip=0, itt;
        int uguali;
    
        len_p = strlen(pattern);
        len_t = strlen(testo);
    
        while(it < len_t)
        {
            if(testo[it] == pattern[ip])
            {
                uguali++;
                itt = it+1;
                ip = ip+1;
                while (itt < len_t && ip < len_p && uguali)
                {
                    if(testo[itt] == pattern[ip])
                    {
                        uguali++;
                    } else
                    {
                        uguali = 0;
                    }
                    itt++;
                    ip++;
                }
                if(uguali == len_p)
                {
                    return it;
                }
            }
            ip = 0;
            it++;
        }
        return -1;
    }
    Intanto provo a perderci un altro pò di tempo...mmm

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Scusate per il topic, dopo 1 ora sono riuscito a risolverlo...
    errore?

    Non ho inizializzato la variabile uguali nella function a 0!

    Ne approfitto per un'altra domanda usando l'allocazione dinamica per creare la giusta memoria per una stringa devo saperne prima la sua lunghezza vero? Non posso prima riceverla in input e poi allocarla? (cosa alquanto ovvia...)

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Prima prendi dell'acqua e poi determini la grandezza della bottiglia?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Eduadie
    Scusate per il topic, dopo 1 ora sono riuscito a risolverlo...
    errore?

    Non ho inizializzato la variabile uguali nella function a 0!

    Ne approfitto per un'altra domanda usando l'allocazione dinamica per creare la giusta memoria per una stringa devo saperne prima la sua lunghezza vero? Non posso prima riceverla in input e poi allocarla? (cosa alquanto ovvia...)
    Lo standard input è comunque una cosa dal quale, per quanta roba ci possa essere dentro, puoi attingere un po' per volta... se devi leggere una stringa arbitrariamente lunga leggila un pezzo per volta, ogni volta allocando (dinamicamente) nuova memoria per il prossimo pezzo, finché necessario.
    Ovviamente in modo efficiente, quindi minimamente intelligente...

    Ma valuta bene se davvero ti serve una cosa del genere o se puoi porre un ragionevole limite di lunghezza (oltre il quale, per esempio, butti via tutto).
    effeffe

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.