PDA

Visualizza la versione completa : [C] confronto tra stringhe


InteristaPazzo9
17-07-2015, 19:02
Ciao ragazzi.. scusate se chiedo sempre aiuto ma ne ho davvero bisogno. Devo fare un esercizio il cui testo è:
"Dato un file di testo (ingresso.txt) che contiene in ogni riga due stringhe(senza spazi separatori) scrivere nel file di uscita (uscita.txt) la stringa la cui lunghezza è maggiore(nel caso siano uguali scrivere la prima delle due). Nota: la lunghezza massima della stringa è 128 caratteri."
Sotto al testo c'è l'esempio di un file elenco.txt cosi composto:
Michele Carmelo
Carmelo Giovanni
Anna Giuseppe
Giuseppe Anna
Giancarlo Giada
Luisa Annalisa

Ora io non ho capito se non ci devono essere spazi separatori tra una riga e l'altra com'è nel file di esempio elenco.txt che ho scritto oppure non ci devono essere spazi tra un nome e l'altro. Io ho fatto l'esercizio creando il file di ingresso così come nell'esempio e sono riuscito a fare funzionare il programma però se tolgo gli spazi tra un nome e l'altro il programma non funziona più. Vi posto il mio codice e vorrei capire se l'esercizio l'ho fatto bene o se non ci devono essere spazi tra i nomi e quindi il codice è stato scritto male. Attendo vostra risposta. Grazie mille.



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


main(){
//inizio dichiarazioni
FILE* pi;
FILE* pu;
char s1[128],s2[128];
int n,i,limite;


//fine dichiarazioni
pi=fopen("elenco.txt","r");
if(pi==NULL){perror("Il file non esiste!"); exit(1);}
pu=fopen("uscita.txt","w");
printf("Le stringhe lette da file sono:\n\n");
for(n=0;n<=128;n++){
limite=fscanf(pi,"%s%s",&s1,&s2);
if(limite==EOF) break;
printf("%s %s\n",s1,s2);
if(strlen(s1)==strlen(s2)){ fprintf(pu,"%s\n",s1); printf("Le stringhe sono uguali, scrivo la prima: %s\n\n",s1);}
else if(strlen(s1)>strlen(s2)){ fprintf(pu,"%s\n",s1); printf("La stringa piu lunga e':%s\n\n",s1);}
else if(strlen(s1)<strlen(s2)){ fprintf(pu,"%s\n",s2); printf("La stringa piu lunga e':%s\n\n",s2);}
}
fclose(pi);
if(pu==NULL){perror("Errore!"); exit(1);}
else printf("\nIl file uscita e' stato creato correttamente.\n\nFine Programma.\n");
fclose(pu);




}

torn24
18-07-2015, 09:46
OFF TOPIC

Noto spesso che più della difficoltà di risolvere un esercizio è la difficoltà di interpretare la traccia :)
La traccia si potrebbe interpretare, due stringhe ognuna formata da un unica parola.

Esempio:
NOME COGNOME, sono due stringhe che non contengono spazi.
CIAO MONDO - IL SOLE, sono due stringhe "ciao mondo" e "il sole" che contengono spazi, è possibile dato l'esempio del file, che tu abbia seguito l'approccio giusto, tuttavia 128 non sono il numero di righe del file ma il numero massimo di caratteri di una stringa array[128], quindi rivedrei il ciclo di lettura file ;)

InteristaPazzo9
18-07-2015, 12:39
Quindi le due variabili char [128] vanno bene o no? dovrei modificare il ciclo for? Se si come? grazie per l'aiuto comunque..

torn24
18-07-2015, 12:59
si, array 128 caratteri va bene!

Per il ciclo lettura file pensavo ad un ciclo while, anche se il tuo for e break è perfettamente funzionante.

Aspetta consigli dai professionisti, io ti propongo una soluzione...



while((limite=fscanf(pi,"%s%s",&s1,&s2))!=EOF){
printf("%s %s\n",s1,s2);
if(strlen(s1)==strlen(s2)){ fprintf(pu,"%s\n",s1); printf("Le stringhe sono uguali, scrivo la prima: %s\n\n",s1);}
else if(strlen(s1)>strlen(s2)){ fprintf(pu,"%s\n",s1); printf("La stringa piu lunga e':%s\n\n",s1);}
else if(strlen(s1)<strlen(s2)){ fprintf(pu,"%s\n",s2); printf("La stringa piu lunga e':%s\n\n",s2);}
}

vbextreme
20-07-2015, 23:07
char s1[130],s2[130];

while ( fgets(s1,130,f1) && fgets(s2,130,f2) )
fputs( (strlen(s1) >= strlen(s2)) ? s1 : s2, f3);


insomma usa fgets, fputs e sei a cavallo.

Loading