Ricerca stringa in stringa

di il
10 risposte

Ricerca stringa in stringa

Ciao a tutti, sto facendo alcuni esercizi sulle stringhe.

Il programma che segue dovrebbe dire se una stringa più piccola (s) è contenuta in una stringa più grande (S) e in che posizione. Se non è mai contenuta, dovrebbe stampare qualcosa del tipo "Non trovata".

Esempio:
S = Prova del provabile
s = pro;

OUTPUT:
Trovato in posizione 0;
Trovato in posizione 11;

Invece, se
s = CIAO!

OUTPUT:
Mai trovato.

Vi incollo un codice che ho scritto.
Sapreste dirmi qual è il problema?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char S[100], s[20];
int i=0, j=0, k, lun, LUN, flag1=0, flag2=0;

printf("inserisci la stringa grande\n");
gets(S);
printf("inseriscila stringa piccola\n");
gets(s);
k=0;

LUN = strlen(S);
lun = strlen(s);


for(i=k; i<LUN-lun; i++)
{
for(j=0; j < lun && flag1 == 0; (j++) && (i++))
{
if(S!= s[j])
flag1 = 1;
}

if (flag1 == 0)
{
printf("Trovato in posizione %d\n",k);
flag2=1;
}

k++;
flag1=0;
}

if(flag2==0)
printf("Mai trovato\n");

return 0;
}


Grazie anticipatamente

10 Risposte

  • Re: Ricerca stringa in stringa

    Prova a sostituire (j++) && (i++) con (j++ , i++)
  • Re: Ricerca stringa in stringa

    Fatto, ma per qualche motivo non funziona con le parole lunghe.
    E dà errore nella posizione.

    Qual è il problema con l'algoritmo?
  • Re: Ricerca stringa in stringa

    La posizione la sbaglia perché k non è inizializzato e nemmeno opportunamente settato.
    Poi dovresti ciclare su tutta la stringa lunga.

    Prova a inizializzare k e settalo quando cominci il ciclo di confronto.

    P.s. Non sto mettendo il codice sul compilatore e risulta difficile leggere codice non indentato, se non funziona ancora cerca di scrivere il
     indentato, grazie.
  • Re: Ricerca stringa in stringa

    K è inizializzato a 0.

    Il problema credo sia nel for esterno, perché i=k è solo la condizione di entrata.
    Poi, siccome non esco dal ciclo esterno, i avrà il valore che ha alla fine del ciclo interno.

    Giusto?
  • Re: Ricerca stringa in stringa

    Sì, è corretto quello che dici.
    Ti conviene a questo punto, mettere:
    k++;
    Poi
    i=k;
  • Re: Ricerca stringa in stringa

    Credo che con questo frammento di codice funzioni, correggimi se sbaglio

    for(i = 0; i < LUN; i++)
    {
    for(i = k; j < lun && flag1 == 0; (j++, i++))
    {
    if(S!= s[j])
    flag1 = 1;
    }
    j = 0;


    Un'altra domanda:
    Qual è la sintassi delle condizioni del for?
    la seconda condizione è booleana, la terza si scrive con le virgole (i++, j--, z=z*2), come si scrive la prima?

    Ps; Scusami, non riesco a indentare il codice sul forum, mi sapresti dire come si fa?
  • Re: Ricerca stringa in stringa

    Per scrivere codice sopra all'editoriale ci sta un tasto
     se scrivi il codice tra i [code] è correttamente indentato.
    
    Nel for i tre campi sono divisi da ;
    Se hai più condizioni le devi dividere da ,
    
    
    
    Invece nel codice che hai scritto nel For interno hai messo i anziché j, perché?
  • Re: Ricerca stringa in stringa

    Ho dimenticato di scrivere che j è inizializzato a 0;

    1) Parto da i=0, j=0, k=0.
    2) Controllo S[0] e s[0];
    3) Si incrementano sia i che j e quindi controllo S[1] e s[1], S[2] e s[2] ecc finché j non è uguale alla lunghezza della stringa piccola;
    4) Riporto la j a 0
    5) Incremento k (scusa, manca nella parte di codice che ti ho incollato)

    Adesso quindi avrò
    i = lun +1, j = 0, k = 1.
    1) Entro nel ciclo esterno.
    2) entro nel ciclo interno e quindi avrò i = k = 1;
    3) controllo gli elementi 1-0, 2-1, 3-2 ecc.
    4) Esco dal for per la j, la reinizzializzo a 0 e incremento k ecc.


    PS: Quindi per esempio posso scrivere (non per fare qualcosa in particolare, solo per capire se è sintatticamnete giusto)
    for((i=0, j=0); j<10; (i++, j++))
    ..... ?
  • Re: Ricerca stringa in stringa

    Il for come l'hai scritto tu è sintatticamente corretto.
    Se vuoi non sono necessarie nemmeno le parentesi, puoi quindi scrivere così:

    for(i=0, j=0; j<10; i++, j++)
  • Re: Ricerca stringa in stringa

    Grazie tante per la pazienza
Devi accedere o registrarti per scrivere nel forum
10 risposte