|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
[C]Controllare che una stringa ne contenga un'altra
Ciao, non riesco a risolvere questo esercizio, in pratica devo continuare a chiedere una stringa s1 e una stringa s2 (ma lo fa un programma esterno che deve essere solo richiamato) e controllare che s2 sia contenuta in s1 fino a che non arrivo al terminatore (\0 per intenderci) o la stringa contenga la parola fine.
Una mano? Grazie
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2008
Messaggi: 808
|
cerchi lungo s1 se esiste il primo carattere di s2. se sì controlli che tutti i caratteri di s2 siano, ordinatamente dopo il carattere trovato in s1.
se sì ecco che è contenuta. se no, ritenti dal secondo carattere di s1 da capo. fino a quando non incontri su s1 il terminatore o non hai una lunghezza dalla fine minore della lunghezza di s2.
__________________
"...qui vige l'uguaglianza: non conta un cazzo nessuno!" (Full Metal Jacket) |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Puoi usare strstr della string.h ?
edit: Ah e' un esercizio. Allora lo devi fare a mano, magari come suggerito da yggdrasil.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
Quote:
Una cosa del genere: Codice:
for(la lungghezza di s1)
{
if(carattere i-esimo di s1 == primo carattere s2)
for(partendo dal carattere i-esimo si s1 fino alla fine di s2)
if(s1 j-esimo == s2 j-esimo)
printf("ok la contiene")
else
printf("nada")
?? Ma come faccio a dirgli smettila se la stringa contiene la parola fine? Qualcuno dice che ha messo un while(s2!='fine') ma all'inizio, ma funge? Sì è un esercizio ma lo devo fare in laboratorio, quindi sì posso usare string.h, qunidi se hai suggerimenti sono bene accetti
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Io farei un ciclo while: finché entrambe le stringhe non sono finite (controlli che i caratteri che stai controllando non siano '\0') confronto i caratteri, se sono diversi restituisco 0, altrimenti proseguo. Uscito dal ciclo controllo che i caratteri a cui sono giunto siano uguali (entrambi '\0'), se sì restituisco 1, altrimenti 0.
Se puoi usare la string.h puoi vedere qui come si usa la funzione strstr: LINK |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
Quote:
Ma non ho capito, li fa vedere che può sostituire un parola con un altra, quindi cosa restituisce, 1 se la trova e 0 se no?
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12861
|
Muoviti usando una "finestra" di ampiezza uguale alla parola che stai cercando e controlla nello stesso ciclo se la prima e l'ultima lettera coincidono con i rispettivi nella parola cercata.
Se sono uguali allora procedi col controllare la seconda e la penultima lettera e così via. Ad esempio: "car" in "cercare" ampiezza 3 cer: c==c vero, r=r vero, e=e falso erc: e==c falso rca: r==c falso car: c==c vero, r=r vero, a=a vero -> parola trovata Ultima modifica di WarDuck : 08-11-2009 alle 10:51. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Quote:
La procedura che ho descritto serve a controllare se due stringhe sono uguali... Quella che ha descritto WarDuck mi sembra corretta, anche se non ho capito perché salta "erc" |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12861
|
Hai ragione in realtà non si può fare così, non puoi saltarla, ora correggo.
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
Ciao, ho provato a fare così, ma non funziona
Codice:
#include <string.h>
#include <stdio.h>
void main ()
{
char s1[20] , s2[20];
int n_s1 , n_s2 , i , j=0 ;
printf("Scrivi S1\n"); // Catturo s1
scanf("%s\n",s1);
printf("Scrivi S2\n"); //Catturo s1
scanf("%s\n",s2);
n_s1=strlen(s1); //Conto i caratteri di s1
n_s2=strlen(s2); //Conto i caratteri di s2
for(i=0;i<n_s1;i++) //Per ogni elemento di s1...
{
if(s1[i]==s2[0]) //...controlla se per caso sia uguale al primo elemento di s2
{
while((s1[i]==s2[j]) && (j<n_s2)) //Se sì, controlla anche gli altri elementi
{
j++;
i++;
}
printf("OK, e' compresa\n");
}
else
printf("non e' compresa\n");
}
getchar();
getchar();
}
@WarDuck: Non capisco cosa mi stai suggerndo, concettualmente sì, ok, ma non saprei come implementarlo
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
Ok, un suggerimento? Almeno dirmi qual'è il problema logico?
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Facciamo un esempio, prova a cercare "sar" in "sassari" con l'algoritmo che hai scritto.
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
Quote:
Posto il codice Codice:
#include <string.h>
#include <stdio.h>
void main ()
{
char s1[20] , s2[20];
int n_s1 , n_s2 , i , j=0,compreso=0 ;
printf("Scrivi S1\n"); // Catturo s1
scanf("%s",s1);
printf("Scrivi S2\n"); //Catturo s1
scanf("%s",s2);
n_s1=strlen(s1); //Conto i caratteri di s1
n_s2=strlen(s2); //Conto i caratteri di s2
for(i=0;i<n_s1;i++) //Per ogni elemento di s1...
{
if(s1[i]==s2[0]) //...controlla se per caso sia uguale al primo elemento di s2
{
while((s1[i]==s2[j]) && (j<n_s2)) //Se sì, controlla anche gli altri elementi
{
j++;
i++;
}
if(j==n_s2) //Se ha raggiunto la fine di S2 senza problemi...
compreso=1; //...allora è contenuta
}
}
if(compreso==1)
printf("OK, e' compresa\n");
else
printf("non e' compresa\n");
getchar();
getchar();
}
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
In verità se cerchi "sar" in "sassari" dice che non è compresa...
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
Quote:
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
Sì, ok, ti stavo prendendo in giro
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Quote:
Il problema è che se la prima lettera coincide parte la ricerca delle altre lettere, ma se questa fallisce la ricerca della seconda parola nella prima non riparte dalla prima lettera della seconda parola e dalla lettera successiva a quella che coincideva nella prima. Es: s1="sassari" s2="sar" i=0, j=0 -> s1[0]==s2[0] -> j++, i++ i=1, j=1 -> s1[1]==s2[1] -> j++, i++ i=2, j=2 -> s1[2]!=s2[2] -> i++ i=3, j=2 -> s1[3]==s2[0] ma s1[3]!=s2[2] -> i++ ... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:01.




















