Potresti spiegarmi come risolvere la questione dello strcmp?
Io ti consigliavo di utilizzare strncmp, comunque:
C:
if(i=1 && strcmp(frasi[i].parola, frasi[i-s].parola) !=0){;}
else{frasi[i].conta+1;}
}
}
Il modo in cui utilizzi strcmp è corretto: la funzione restituisce 0 se le stringhe sono uguali, un valore minore di 0 se il primo carattere diverso ha un valore minore nella prima stringa, e maggiore di 0 se il primo carattere diverso ha un valore maggiore nella prima stringa.
Insomma, se vuoi vedere se sono uguali devi usare
strcmp(stringa1, stringa2) == 0
.
Sempre nella parte di codice che ho riportato, c'è un errore:
i=1
è un assegnamento, e visto che assegni il valore 1, viene valutato sempre a true.
Non ti serve lasciare quel "punto e virgola" nelle graffe se non ci sono istruzioni, inoltre non è proprio bello da vedere; avrebbe più senso invertire la condizione:
C:
if(istrcmp(frasi[i].parola, frasi[i-s].parola) == 0){
frasi[i].conta++;
}
Anche in questa parte c'era un errore:
frasi[i].conta+1;
, questo incrementa il valore e scarta il risultato. In pratica l'incremento non viene mai memorizzato. Puoi usare l'operatore di incremento come ho fatto li sopra, oppure anche fare
frasi[i].conta+=1
(preferibile il primo, ovvero ++, quando si tratta di 1 sola unità).
Ho dato una sistemata al codice, indentandolo meglio:
C:
#include <stdio.h>
#include <string.h>
int main(){
int i, s;
struct insieme {
char parola[26+1];
int conta;
};
struct insieme frasi[10];
printf("Inserisci le parole\n");
for(i=0;i<10;i++){
for(s=0;s<10;s++){
scanf("%s", &frasi[i].parola);
if(strcmp(frasi[i].parola, frasi[i-s].parola) !=0){
frasi[i].conta++;
}
}
}
for(i=0;i<100;i++){
printf("la parola: %s è ripetuta : %d", frasi[i].parola, frasi[i].conta);
}
return 0;
}
Per evitare di mettere quel controllo sull'indice del ciclo (ovvero se è 0, non sottrarre), puoi leggere la prima stringa fuori dal ciclo, e iniziare il ciclo dal valore 1.
Ci sono poi altre cose che non vanno bene: ad esempio, stai allocando una struttura statica di 10 frasi, ma stai facendo 2 cicli innestati ciascuno da 0 a 10; non ha molto senso questa cosa se ci pensi bene: supponiamo di avere i=0 e s=5, qui avresti come indice -5, che non esiste (o meglio, stai andando a leggere altra memoria nello stack, ed è un errore grave).
Non ultimo, non ci sarà mai alcun match fatto in questo modo. Per ogni inserimento dovresti verificare l'intero array e verificare quindi le singole parole (scorrendo da indice 0 a indice N, dove N sono i valori inseriti sino a questo momento).
Poi: l'ultimo ciclo è su 100 elementi, ma ci sono 10 frasi allocate. Anche questo è un problema, perchè vai a leggere memoria non allocata (e nel migliore degli scenari, vedrai dati sbagliati, nel peggiore crasha il programma... e puoi sperare nel crash, almeno vedresti l'errore 😁 ).
Per come l'hai impostato non ti serve nemmeno fare una matrice: vuoi 100 frasi? Fai direttamente
frasi[100]
. Accedi già linearmente al vettore usando solo una variabile, quindi puoi rimuovere il ciclo interno (quello che usa s come contatore).
Una cosa tipo:
Codice:
// scanf elemento frasi[0].parola
for(int i=1; i < 100; i++) {
// scanf....
// FOR ogni singolo elemento del vettore...
// IF strcmp(frasi[i-1].parola, frasi[i].parola) == 0
// ENDFOR
}
Questo credo sia il risultato che vuoi ottenere. In questo caso però non avresti più delle frasi di lunghezza N, ma delle frasi di 1 parola di lunghezza max 26.
Però se vuoi farlo per prenderci la mano e capire meglio i concetti, mi sembra una buona idea.
Ti consiglierei però di ripassare anche i fondamenti: operatori di incremento/decremento etc, così come il modo in cui vengono valutate le condizioni etc etc (errori come i=1 invece di i==1 per distrazione capitano a tutti; infatti si utilizza solitamente l'assegnamento invertendo gli operandi: 1=i, in modo tale da avere un errore in compilazione visto che non puoi assegnare una variabile a un numero).
Se hai domande o dubbi, continua puoi a scriverci qui, il primo che può ti risponderà.