PDA

View Full Version : [C] Anomalia in programma di ordinamento


-hide-
09-04-2010, 09:53
Ho la necessitā di ordinare un elenco di nomi, formattato in modo particolare (con la tabulazione tra nome e cognome o viceversa), presenti su un file. Il risultato dev'essere riportato su un secondo file.
L'incovazione del programma deve essere seguita da due argomenti, il primo č l'elenco dei nomi esistente ed il secondo quello che deve formarsi.
Ovviamente da qui non vi č niente di impossibile ma si č presentata un'anomalia quando lo stesso proramma č stato fatto girare su Ubuntu del mio amico e sul mio Mac: a lui funziona tutto mentre a me non ordina nulla o quasi.

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

#define DIM 20

void sbsort (char **vett, int e);

int main (int argc, char* argv[]) {
unsigned short int ind, i, j, k;

/* Inizio fase di lettura da file */

FILE* fr = fopen (argv[1], "r"); /* Apro il file in lettura */
/* Verifico la corretta apertura del file */
if (fr == NULL) {
printf ("Error: file di lettura non aperto");
exit (1);
}
else printf ("\nLoading...\n");

char* contatti[DIM]; /* Array di Stringhe */
for (i=0; i<DIM; i++) contatti[i] = (char*) malloc (sizeof(char) * 30);
for (ind=0; ((fgets (contatti[ind], DIM-1, fr)) != NULL) && (ind != DIM); ind++);
fclose (fr); /* Chiudo il file precedentemente aperto */
printf("Completato\n");

printf ("\n\tDEBUG 1 - %d nomi presenti su file dopo la lettura\n", ind);
for (k=0; k<ind; k++) {
printf ("\t%s", contatti[k]);
}

sbsort (contatti, ind); /* Ordino array */


/* Inizio fase di scrittuta su file */

FILE* fw = fopen (argv[2], "w"); /* Apro il file di scrittura */
for (j=0; ((fputs (contatti[j], fw)) != EOF) && (j<ind); j++); /* Scrivo sul file */
fclose (fw); /* Chiudo il file di scrittura */


/* Inizio fase di stampa dei contatti a schermo */

printf ("\n\n\tDEBUG 2 - %d nomi presenti su file dopo la scrittura\n", ind);
for (k=0; k<ind; k++) {
printf ("\t%s", contatti[k]);
}
printf ("\n\n");
return 0;
}

/* Funzione che ordina array di stringhe */
void sbsort (char **elenco, int NumeroContatti) {
int i, j;
char *t;
t = (char*) malloc (sizeof(char) * 30); /* Stringa temporanea che conterrā i nomi da sortare */

for (i=0; i<NumeroContatti-1; i++)
for (j=i+1; j<NumeroContatti; j++)
if (strcmp (elenco[i], elenco[j]) == 1) {
strcpy (t, elenco[i]);
strcpy (elenco[i], elenco[j]);
strcpy (elenco[j], t);
}

}

Ed ecco un elenco di nomi:
Pallino Pinco
Rossi Giuseppe
Guglielmo Marconi
Galileo Galilei
Argento Dario
Dog Dylan
Willer Tex
Zanetti Javier

-hide-
09-04-2010, 18:19
up1

...sarebbe importante!

lupoxxx87
09-04-2010, 19:16
mi pare che il problema sia causato dalla mancanza del carattere terminatore per le stringhe, quindi le operazioni su stringhe non hanno effetto