Confrontare stringhe di parole in una frase - C

di Anonimizzato27573 il
17 risposte
Ciao, sta volta sono bloccato in questo esercizio...
la parte a) l'ho completata...
ma la b) è un po' più ostica, come faccio a far scorrere la stringa 2 una parola più avanti della stringa 1 per il confronto?
il codice che ho scritto io compila ma da un risultato strano...

/*a) Scrivere un sottoprogramma confrontastringhe che riceve come parametro due stringhe
str1 e str2. Il sottoprogramma stampa a video i caratteri uguali che si trovano nella stessa
posizione in entrambe le stringhe e restituisce il loro conteggio.
b) Scrivere un programma che apre un file di testo testo.txt contenente una serie di lunghezza
indefinita (zero o più) di parole ciascuna lunga al massimo 15 caratteri. Il programma legge ciascuna
parola contenuta nel file e la confronta con la sua precedente mediante l’invocazione del
sottoprogramma confrontastringhe (il primo confronto viene eseguito fra la prima e la seconda
parola). Il programma infine stampa a video la somma complessiva di tutti i caratteri comuni tra
ciascuna coppia di parole consecutive. Ad esempio, se il file contiene il seguente testo:
Gatto Gattini 120 10 alce dice bica informatica 34tre tre tr
Il programma stamperà a video: Gatt 1 ce ic tr ed infine stamperà il valore 11.
*/
#include <stdio.h>
#include <string.h>
#define dim 5
int confrontastringhe(char a[], char b[]){
	int	lena=strlen(a);
	int	lenb=strlen(b);
	int i;
	int len;
	int cont=0;
		if(lena<lenb){
			len=lenb;
		}else{
			len=lena;
		}

		for(i=0;i<len;i++){
			if(a[i]==b[i]){
				cont++;
			}
		}
	
	return cont;
}


int main(){
	
FILE* fp;
char str1[dim];
char str2[dim];
fp=fopen("parole.txt","r"); 

if(fp==NULL){ 
	printf("errore nell'apertura del programma");
}else{
	
	while(fscanf(fp,"%s %s",str1, str2)!=EOF){
	
		printf("%d ",confrontastringhe(str1,str2));

	}

}

return 0;	
}

17 Risposte

  • A parte che dim dovrebbe essere 16 (15 caratteri più il terminatore nullo), potresti impostarlo così
    
    char str[dim] = {0};
    char str1[dim] = {0};
    char str2[dim] = {0};
    int parole = 0;
    [...]
        while(fscanf(fp,"%s",str)!=EOF){
    	strcpy(str1, str2);
    	strcpy(str2, str);
    	parole++;
    	if(parole > 1){
    	   printf("%d ",confrontastringhe(str1,str2));
    	   parole = 0;
    	}
        }
    
  • Ciao weierstrass, per questo esercizio ho risolto.
    posto qui sotto la soluzione per chi la volesse:
    #include <stdio.h>
    #include <string.h>
    #define dim 16
    int confrontastringhe(char a[], char b[]){
    	int	lena=strlen(a);
    	int	lenb=strlen(b);
    	int i;
    	int len;
    	int cont=0;
    		if(lena<lenb){
    			len=lenb;
    		}else{
    			len=lena;
    		}
    
    		for(i=0;i<len;i++){
    			if(a[i]==b[i]){
    				cont++;
    				printf("%c", a[i]);
    			}
    		
    		}
    		printf(" ");
    	return cont;
    }
    
    
    int main(){
    	
    FILE* fp;
    int n[30];
    char str1[dim];
    char str2[dim];
    int conto;
    fp=fopen("parole.txt","r"); 
    
    if(fp==NULL){ 
    	printf("errore nell'apertura del programma");
    }else{
    	
    	while(fscanf(fp,"%s %s",str1, str2)!=EOF){
    	
    		conto=conto+confrontastringhe(str1, str2);
    
    	}
    	printf(" %d", conto);
    }
    fclose(fp);
    return 0;	
    }
  • Scusa se te lo dico, ma mi sembra che tu non abbia risolto il probelma (svolto la consegna, diciamo così)
    tu non confronti ogni "parola" con la precedente, ma leggi 2 "parole" per volta e le confronti tra di loro, la prima con la seconda, ma mai la prima con la seconda della volta precedente
    ah, inoltre, non hai chiuso il file, vero è che subito dopo esci dal programma, ma non è bella cosa lasciare aperti i file
  • Se faccio avanzare la stringa1 e la stringa2 allora la stringa1 prenderà il valore della stringa2 e la stringa2 proseguirà nella parola dopo, ed è esattamente come confrontare la prima con la seconda della volta precedente.

    il file mi sono dimenticato di chiuderlo solo qui, scusate... modifico subito.
  • Hai un file da fare le prove?

    PS ho provato il tuo programma
    è sbagliato, come temevo
  • A me funziona correttamente, che errore ti da a te?
    Allegati:
    27573_889760ec9f47df72b7db30a615ad8b93.png
    27573_889760ec9f47df72b7db30a615ad8b93.png
  • A me, siccome hai dichiarato ma non inizializzato la variabile conto mi da tutte le volte un numero differente
    di più se non mi metti il file che usi per le prove non lo posso fare
    mettimi qui il file e vediamo
  • Il mio è un semplice file .txt che ho creato al momento, nella foto che ho allegato ho inserito un immagine di cosa c'è scritto dentro(il riquadro in bianco), ma anche se cambio il contenuto del file il programma compila e funziona correttamente.

    comunque se il problema è solo la variabile conto basta che la inizializzi a 0, a me non da sto problema però.
  • Che non dia problemi non significa che sia corretto

    allora le parole che usi per provare sono:
    ciao come va vattene via vittorio torino torino torino

    confermi?
  • Esatto sono quelle parole
  • Effettivamnte il tuo da:
    c va vi torino torino 17

    peccato che dovrebbe dare
    c va v vi torino torino 18

    se guardi anche tra "vattene" e "via" c'è una lettera in comune, la 'v' che a te non compare
  • Strano che non compaia... non l'avevo notata, sai dirmi come mai?
  • Te lo ho già detto, e lo hai ignorato

    e ne hai ancora uno di (piccolo) problema, anche se non è grave, solo un warning, ma..........
  • Ho capito, ma logicamente il mio programma dovrebbe confrontare 2 parole alla volta ma stranamente salta solo quella v.
    proverò a rifarlo come dici tu e seguendo il metodo di weierstrass che mi ha scritto sopra.

    mi dici l'altro problema?
Devi accedere o registrarti per scrivere nel forum
17 risposte