PROBLEMA Stringhe!

Pasquale1989

Nuovo Utente
4
0
Salve a tutti sono pasquale e sono nuovo in questo forum, da circa un paio di giorni mi sto cimentando in questo esercizio in programmazione c, banale ma con esito negativo:
.Data una parola ricercare nel dizionario tutte le parole che hanno almeno tre lettere consecutive in comune con la parola data.
Praticamente per il dizionario ho creato una struct in questo modo perche mi serviva anche per il 1 punto del esercizio
C:
struct dizionario
{  char *parola;
  char *significato;
  char *sinonimi;
}Dizionario[50];
 
Ultima modifica da un moderatore:

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Si ma in cosa sbagli? Perchè ti dà esito negativo?
 

Pasquale1989

Nuovo Utente
4
0
Non riesco a capire come fare la funzione ne ho creata una che mi permette di vedere se esiste la sottostring e mi ritorna 0 e 1 per il resto non riesco a farmi stampare le parole che hanno 3 lettere consecutive con la parola data
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Così ne sappiamo quanto prima però. Il fatto che non riesci a farti stampare 3 lettere può essere dovuto a molteplici fattori: non stampa i caratteri che ti aspetti? Stampa caratteri "casuali"? Crasha?
Senza codice o almeno spiegazioni su che cosa accade non ti si può rispondere nel merito; le cause possono essere molte.

L'unica osservazione che posso portare risiede nel come hai impostato la struttura: la parola è 1, il significato è fondamentalmente 1, ma i sinonimi saranno molti; ti servirebbe un array di puntatori a char per memorizzare N stringhe.
 

Pasquale1989

Nuovo Utente
4
0
mio dizionario:
C:
void inizializza_dizionario(struct dizionario Dizionario[])
{
    Dizionario[0].lettera='a';
    Dizionario[0].parola="Abito";
    Dizionario[0].significato="Indumento che si porta sopra la biancheria";
    Dizionario[0].sinonimi="Capo,indumento";
    Dizionario[1].lettera='b';
    Dizionario[1].parola="Bontà";
    Dizionario[1].significato="Carattere di chi è d’animo buono e gentile";
    Dizionario[1].sinonimi="Calma,ranquillità,finezza";
    Dizionario[2].lettera='c';
    Dizionario[2].parola="Coccio",
    Dizionario[2].significato="Frammento di vaso o di altro oggetto di terracotta";
    Dizionario[2].sinonimi="Frammento,terraglia";
    Dizionario[3].lettera='d';
    Dizionario[3].parola="Dado";
    Dizionario[3].significato="Cubetto che reca sulle sei facce i punti,da uno a sei";
    Dizionario[3].sinonimi="Cubo,cubetto,piedistallo";
    Dizionario[4].lettera='e';
    Dizionario[4].parola="Ente";
    Dizionario[4].significato="Istituzione provvista di personalità giuridica";
    Dizionario[4].sinonimi="Istituzione, organismo, istituto";
    Dizionario[5].lettera='f';
    Dizionario[5].parola="Futile";
    Dizionario[5].significato="Di scarso interesse,di poca importanza e senza profondità";
    Dizionario[5].sinonimi="frivolo";
    Dizionario[6].lettera='g';
    Dizionario[6].parola="ghiaccio";
    Dizionario[6].significato="Stato solido dell'acqua che, alla pressione di un'atmosfera, viene raggiunto a zero gradi Celsius";
    Dizionario[6].sinonimi="ghiacciato,freddo,gelato";
    Dizionario[7].lettera='h';
    Dizionario[7].parola="hotel";
    Dizionario[7].significato="Edificio predisposto per alloggiare persone a pagamento";
    Dizionario[7].sinonimi="albergo";
    Dizionario[8].lettera='i';
    Dizionario[8].parola="igloo";
    Dizionario[8].significato="è un rifugio con blocchi di neve";
    Dizionario[8].sinonimi="ghiacciata";
    Dizionario[9].lettera='l';
    Dizionario[9].parola="lampo";
    Dizionario[9].significato="fenomeno luminoso che accompagna le scariche elettriche nell'atmosfera";
    Dizionario[9].sinonimi="freccia,fulmine,saetta";
    Dizionario[10].lettera='m';
    Dizionario[10].parola="mano";
    Dizionario[10].significato="Organo prensile e tattile dell'uomo posto all'estremità degli arti superiori e formato dalle cinque dita, dal dorso, dalla palma (o palmo) e dal polso";
    Dizionario[10].sinonimi="organo prensile,organo tattile";
    Dizionario[11].lettera='n';
    Dizionario[11].parola="nano";
    Dizionario[11].significato="Riferito a persona, animale o vegetale, che presenta sviluppo limitato e proporzioni ridotte rispetto alle normali";
    Dizionario[11].sinonimi="bassotto,piccoletto,lillipuziano";
    Dizionario[12].lettera='o';
    Dizionario[12].parola="ozio";
    Dizionario[12].significato="Il non far nulla per pigrizia, per abitudine, per malattia o per altri impedimenti";
    Dizionario[12].sinonimi=" inattività, inoperosità, inerzia, inazione";
    Dizionario[13].lettera='p';
    Dizionario[13].parola="Prete";
    Dizionario[13].significato="Nel cattolicesimo, ministro del culto appartenente al clero secolare";
    Dizionario[13].sinonimi="sacerdote, padre, ministro del culto, celebrante, officiante";
    Dizionario[14].lettera='q';
    Dizionario[14].parola="Quadro";
    Dizionario[14].significato="Dipinto su tela o altro, di forma perlopiù quadrangolare";
    Dizionario[14].sinonimi="spazio quadrato, riquadro";
    Dizionario[15].lettera='r';
    Dizionario[15].parola="roccia";
    Dizionario[15].significato="Formazione costituita da uno o più minerali aggregati";
    Dizionario[15].sinonimi="pietra,sasso";
    Dizionario[16].lettera='s';
    Dizionario[16].parola="Sedia";
    Dizionario[16].significato="Sedile formato da un piano poggiante su quattro gambe e da una spalliera per poggiare la schiena";
    Dizionario[16].sinonimi="seggiola";
    Dizionario[17].lettera='t';
    Dizionario[17].parola="testa";
    Dizionario[17].significato="Parte del corpo, anteriore negli animali e superiore nell'uomo, che contiene il cervello";
    Dizionario[17].sinonimi="capo,cranio,capoccia,zucca,cocuzza";
    Dizionario[18].lettera='u';
    Dizionario[18].parola="uovo";
    Dizionario[18].significato="Gamete femminile dal quale, una volta giunto a maturazione e fecondato dal gamete maschile, si sviluppa, all'interno o all'esterno del corpo materno,l embrione di un nuovo individuo, che si nutre per tutto il periodo della gestazione, delle sostanze di riserva contenute nell' uovo stesso";
    Dizionario[18].sinonimi="ovulo";
    Dizionario[19].lettera='v';
    Dizionario[19].parola="Vuoto";
    Dizionario[19].significato="Che non contiene nulla; in cui non c'è nessuno";
    Dizionario[19].sinonimi="svuotato, sgombrato, evacuato";
    Dizionario[20].lettera='z';
    Dizionario[20].parola="zanzara";
    Dizionario[20].significato="Piccolo insetto dal corpo filiforme e dalle lunghe zampe, diffuso nei luoghi umidi in prossimità dell'acqua";
    Dizionario[20].sinonimi="Scocciatore, seccatore, disturbatore, rompiscatole";
}
 funzione per vedere se il match esiste
int esito_match(char chiave[],char *parola)
{ 
    int n=strlen(chiave),i;
    for(i=0;i<n-3;i++)
    {
       if( strncmp(parola+i,chiave+i,3))
          return 1;
       else
        return 0;
      }
}
il mio problema che non riesco a far stampare la parola che abbia 3 lettere uguali a chiave ,forse ci vuole un altra funzione cmq sto utilizzando 3 file uno main uno funzioni e uno header
nel main secondo me dovrei far un ciclo for per tutte le parole del dizionario ed entrare nel campo del dizionario ma manca qualcosa
 
Ultima modifica da un moderatore:

maxnaldo

Nuovo Utente
13
2
credo che tu abbia invertito il boolean di ritorno.

la strncmp, così come la strcmp o la memcmp, ti restituisce 0 se i due valori comparati sono uguali, e 0 come valore significa "false".

quindi o aggiungi alla if: "if( strncmp(parola+i,chiave+i,3)==0)"

oppure inverti i valori delle return.
 

maxnaldo

Nuovo Utente
13
2
bisognerebbe anche vedere i parametri che passi alla funzione,

comunque stai controllando passo passo i tre caratteri sia della stringa1 che della stringa2, il che significa che il match avviene solo se i 3 caratteri si trovano anche nella stessa posizione all'interno delle due stringhe.

ps. secondo me dovresti fare due cicli, uno dentro l'altro, quello esterno si sposta di un carattere alla volta nella stringa1, quello interno fa il match dell'attuale posizione della stringa1 spostandosi di un carattere per volta nella stringa2. In pratica cerchi tutte le triplette della 1 all'interno di tutte le posizioni della 2.

ah dimenticavo, stai anche interrompendo il ciclo al primo match

prova così, non è il massimo come implementazione ma dovrebbe funzionare:
C:
int esito_match(char chiave[],char *parola)
{
    int n1=strlen(chiave);
    int n2=strlen(parola);
    int i,j;
    for(i=0;i<n2-3;i++)
    {
        for(j=0;j<n1-3;j++)
        {
            if(strncmp(parola+i,chiave+j,3)==0)
                return 1;
        }
    }
    return 0;
}
 
Ultima modifica da un moderatore:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!