problème d'exécution

Le
anc break
Bonjour,
J'ai fait mon programme C suivant sous windows avec Visual studio
2008.
Supposons que on a 4 fichiers textes :
Soit le fichier "f.txt":
a b
a c
a d
b c
b d
c d
a b c
a b d
b c d
a c d
a b c d

Soit "f1.txt" :
a
d a
c a
b c a

Soit "f2.txt" :
a
c
b
d
b a
d a
b c
d c
b c a

Soit "f3.txt" :
a
b
c
c a
d a
b a
b c
b c a

Ce programme permet d'afficher le résultat de comparaison entre :
- f.txt et f1.txt
- f.txt et f2.txt
- f.txt et f3.txt

J'ai déjà décrit auparavant la procédure de comparaison entre deux
fichiers qui doit respecter les deux conditions :
l'ignorance de l'ordre entre les mots et l'inclusion.

Voici le programme:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define MAX_SIZE 1024



char* strndup(const char *str, size_t n)

{

char *ret = malloc((n+1) * sizeof (char));



if (!ret)

exit(0); strncpy(ret, str, n);

ret[n] = 0;



return ret;

}



void free_tab(char** t)

{

char** head = t;



while (t && *t)

{

free(*t);

t++;



}

free(head);

}



char** get_word(const char* str)

{

char* pos = NULL;

char** res = NULL;

int nb = 0;



do

{

int size = 0;



pos = strchr(str, ' ');

if (pos)

size = pos - str; else

size = strlen(str) - 1; /* - 1 to get rid of */

nb++;

res = realloc(res, (nb + 1) * sizeof (char*));

res[nb -1] = strndup(str, size);

str = pos + 1;

}

while (pos);



res[nb] = 0;



return res;

}



int is_same(const char* const s1, const char* const s2)

{

char **t1, **t2;

int ret = 0;



t1 = get_word(s1);

t2 = get_word(s2);



if (t1 && t2)

{

char** tab1 = t1;

char** tab2 = t2;

int nb = 0;

int size = 0;



while (tab1 && *tab1)

{

tab2 = t2;

while (tab2 && *tab2)

{

if (!strcmp(*tab1, *tab2))

nb++;

tab2++;

} tab1++;

size++;

}



ret = (nb >= size);

free_tab(t1);

free_tab(t2);

}

return ret;

}



char** compare_file(const char* filename1, const char* filename2)

{

FILE *f, *f1;

char s[MAX_SIZE], s1[MAX_SIZE];

int a;

char** res = NULL;

int nb = 0;



f = fopen(filename1, "r");

f1 = fopen(filename2, "r");

if (f && f1)

{

while (fgets(s, MAX_SIZE, f))

{

a = 0;

rewind(f1);

while (fgets(s1, MAX_SIZE, f1))

{

if (is_same(s, s1))

{

a = 1;

break;

}

}

if (!a)

{

nb++;

res = realloc(res, (nb + 1) * sizeof (char*));

res[nb - 1] = strndup(s, strlen(s) - 1); // Get rid of the

res[nb] = 0;

}

}

fclose(f);

fclose(f1);

}

return res;

}


void display_tab(char** tab)

{

while (tab && *tab)

{

printf("%s", *tab);

tab++;

}

}



int main()

{

char** res = NULL;

char** intersect = NULL;

char input[32];

int i;


for (i = 1; i <= 3; i++)

{

sprintf(input,"f%d.txt",i);

res = compare_file("f.txt",input);


printf("Comparing f.txt and %s:", input);

display_tab(res);

free_tab(res);

}
return 0;

}


Après la compilation et l'exécution, j'obtiens l'affichage suivant:

Comparing f.txt and f1.txt:
a b
b d
c d
a b c
a b d
b c d
a c d
a b c d
Comparing f.txt and f2.txt:
a c
b d
a b c
a b d
b c d
a c d
a b c d

Comparing f.txt and f3.txt:
b d
c d
a b c
a b d
b c d
a c d
a b c d
Final result:


Mais, le résultat souhaité est :


b d
c d
a b d
b c d
a c d
a b c d
Comparing f.txt and f2.txt:
b d
a b d
b c d
a c d
a b c d
Comparing f.txt and f3.txt:
b d
c d
a b d
b c d
a c d
a b c d


J'ai révisé mon code beaucoup des fois mais je ne trouve pas pourquoi
je n'obtiens pas le résultat souhaité.

Vous avez le code et les fichiers textes. Pouvez vous tester ce code
et me dire que est ce il affiche chez vous ?

Je tiens compte sur vos aides.

Merci.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
anc break
Le #20070081
Bonjour,

Si vous voulez je vous explique encore le problème.
Quelles sont les modifications à faire pour aboutir à une solution ?
Si vous avez autre solution à ce problème alors pas de problème...
Je suis bloquée et j'ai besoin de vos aides.

Merci.
domi
Le #20071161
anc break wrote:

Mais, le résultat souhaité est :
b d
c d
....
J'ai révisé mon code beaucoup des fois mais je ne trouve pas pourquoi
je n'obtiens pas le résultat souhaité.



C'est quasi incompréhensible à lire.
Utilise le Debugger de Visual et fais du pas à pas en regardant à chaque
fois toutes tes variables et tu verras à quel moment tu n'obtiens pas ce
que tu souhaites.
C'est fait pour ça le Debugger...
anc break
Le #20072581
>Utilise le Debugger de Visual et fais du pas à pas



Comment je vais utiliser le Debugger de Visual 2008 et fais du pas à
pas ?

Menu Déboguer ==> .... puis qu'est ce que vais choisir ?

Comment utiliser le Debugger sur tout le programme et comment que
l'erreur est la bas ?

Merci.
domi
Le #20079871
anc break wrote:
Utilise le Debugger de Visual et fais du pas à pas



Comment je vais utiliser le Debugger de Visual 2008 et fais du pas à
pas ?

Menu Déboguer ==> .... puis qu'est ce que vais choisir ?

Comment utiliser le Debugger sur tout le programme et comment que
l'erreur est la bas ?



Tu mets des Break Points, tu débugges pas à pas et tu regardes les
différentes valeurs. Du classique, quoi..
Publicité
Poster une réponse
Anonyme