Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Parola chiave all' interno di un testo

    Salve a tutti,ho scritto una funzione che prende come parametri di ingresso due puntatori a due stringhe differenti (uno è la parola chiave da cercare,l' altro il testo) e un numero (solitamente 0,che mi serve per portare avanti l' algoritmo ricorsivo).
    Apparte il fatto che mi da warning: "control reaches end of non-void function",ho notato che funziona male,cioè io voglio che mi ritorna 1 solo se tutta la parola chiave è contenuta,invece mi ritorna 1 anche quando un pezzo della parola chiave è contenuta.
    Mi spiego meglio,ad esempio cerco la parola "ciaop" e se trova "ciao" mi ritorna 1 comunque
    Ecco qua il codice:
    codice:
    int parola_chiave(char *p1,char *p2,int a)
    {
        if(*p2=='\0'&&*p1!='\0')
          return 0;
        else if(*p1=='\0')
          return 1;
        else
        {
            if(*p1==*p2)
              {
                  p1++;
                  a++;
              }
            else
              {
                  p1-=a;
                  a=0;
              }
            p2++;
            parola_chiave(p1,p2,a);
        }
    }

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Risolto,andava messo:
    codice:
    return 1*parola_chiave(p1,p2,a);

  3. #3
    A dire il vero non si è capito molto di quello che vuoi fare con quella funzione, ma soprattutto non ho capito perchè implementarla in quel modo (a cosa serve "a"?) e perchè usare una funzione ricorsiva?


    Questa è la tua modificata. Fa le stesse cose?

    codice:
    int parola_chiave( char *key, char *text )
    {
        if( (*key == '\0') && (*text == '\0') )
      	return 1;
    
        if( *key != *text )
    	return 0;
    
        else
        {
    	++key;
    	++text;
    
            return parola_chiave( key, text );
        }
    }
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Lo scopo è ricercare una parola chiave in un testo,ma il fatto è che il testo potrebbe anche essere lunghissimo e contenere molti spazi,per cui ho usato la variabile a per tenere conto di quante lettere erano "giuste" (nel senso che se ad esempio cerco "ciao" e finora ho trovato "cia",3 sono giuste,ma se la prossima non è 'o' ,"riavvolgo tutto" e riparto a cercare dalla prima lettera,cioè la 'c',finchè non esaurisco il testo).
    Si parte dal presupposto che la parola chiave potrebbe essere cortissima rispetto al testo in cui si cerca.
    Col tuo metodo se cerco "ci" dentro a una stringa "abcilo" mi da 0 come risultato,ma ci è contenuta nella stringa.
    L' ho riscritta così:

    codice:
    int parola_chiave(char *p1,char *p2,int a)
    {
        if(*p2&&*p1)
        {
            if(*p1==*p2)
            {
                p1++;
                a++;
            }
            else
            {
                p1-=a;
                a=0;
            }
            p2++;
            return 1*parola_chiave(p1,p2,a);
        }
        else if(*p1==0)
          return 1;
        else
          return 0;
    }
    E funziona,ma c'è modo di farla non ricorsiva e eliminando la variabile int in eccesso?

  5. #5
    A parte che già esiste la funzione strstr, una funzione del genere si può implementare facilmente in maniera iterativa, magari spezzando il problema in due pezzi (scansione della stringa, confronto tra la stringa da cercare e la sottostringa alla posizione corrente).
    codice:
    int parola_chiave(const char * Stringa, const char * DaCercare)
    {
        size_t lDaCercare=strlen(DaCercare);
        for(;*Stringa;Stringa++)
        {
            if(!strncmp(Stringa, DaCercare, lDaCercare))
                return 1;
        }
        return 0;
    }
    Se strncmp viene espansa in linea non dovrebbero esserci penalizzazioni di performance rispetto allo scandire la stringa alla ricerca del primo carattere e solo quando lo si trova richiamare strncmp.

    Per inciso: se vuoi fare tutto te anche strlen e strncmp sono di facile realizzazione:
    codice:
    size_t strlen(const char * Str)
    {
        size_t ret;
        for(ret=0; *Str; Str++, ret++)
            ;
        return ret;
    }
    
    int strncmp(const char * Str1, const char * Str2, size_t Limit)
    {
        for(;*Str1==*Str2 && Limit; Str1++, Str2++, Limit--)
            ;
        return ((int)*Str1)-((int)*Str2);
    }
    (nota: non ho provato nulla, ma dovrebbe essere più o meno giusto)
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Il modo c'è sempre, poi bisogna vedere se effettivamente è quello che cerchi...


    Tu vuoi che torni 0 se non è presente la sotto-stringa e 1 se è presente in qualsiasi posizione?

    codice:
    int parola_chiave( char *key, char *text )
    {
    	char *i = NULL;
    
    	while( *text != '\0' )
    	{
    		i = key;
    
    		do
    		{
    			if( *i != *text )
    			{
    				++text;
    				break;
    			}
    
    			++i;
    			++text;
    		}
    		while( *i != '\0' );
    
    		if( *i == '\0' )
    			return 1;
    	}
    
    	return 0;
    }
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Esattamente quello che intendevo,deve essere come un motore di ricerca (ma che lavora su un file piccolissimo) che stampa tutto il testo se trova anche una sola parola all' interno.
    La sto usando in un progetto di un agenda elettronica.
    Ho provato i codici e funzionano,grazie a entrambe

  8. #8
    Figurati

    Entrambe?


    Piccolo appunto, il codice di MItaly, forse è meno efficiente (bisognerebbe verificare), ma sicuramente più portabile. Quindi a meno che non sia proprio necessario un algoritmo altamente performante (che in teoria ti dovrebbe portare anche al miglioramento di quello che ho postato io), ti consiglio di utilizzare il suo suggerimento.

    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Un pò lo sospettavo che si diceva antrambi (son stato la a pensarci ).
    Devo riconsiderare la legge di Murphy

  10. #10
    Per inciso, come già detto, la libreria standard già fornisce la funzione strstr, che probabilmente è estremamente ottimizzata (potrebbe essere addirittura fornita come intrinsic scritto direttamente in assembly), per cui ti consiglio di usare quella invece di reinventare la ruota.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.