Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème d'exécution

4 réponses
Avatar
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=E9sultat de comparaison entre :
- f.txt et f1.txt
- f.txt et f2.txt
- f.txt et f3.txt

J'ai d=E9j=E0 d=E9crit auparavant la proc=E9dure 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 =3D malloc((n+1) * sizeof (char));



if (!ret)

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

ret[n] =3D 0;



return ret;

}



void free_tab(char** t)

{

char** head =3D t;



while (t && *t)

{

free(*t);

t++;



}

free(head);

}



char** get_word(const char* str)

{

char* pos =3D NULL;

char** res =3D NULL;

int nb =3D 0;



do

{

int size =3D 0;



pos =3D strchr(str, ' ');

if (pos)

size =3D pos - str; else

size =3D strlen(str) - 1; /* - 1 to get rid of \n */

nb++;

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

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

str =3D pos + 1;

}

while (pos);



res[nb] =3D 0;



return res;

}



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

{

char **t1, **t2;

int ret =3D 0;



t1 =3D get_word(s1);

t2 =3D get_word(s2);



if (t1 && t2)

{

char** tab1 =3D t1;

char** tab2 =3D t2;

int nb =3D 0;

int size =3D 0;



while (tab1 && *tab1)

{

tab2 =3D t2;

while (tab2 && *tab2)

{

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

nb++;

tab2++;

} tab1++;

size++;

}



ret =3D (nb >=3D 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 =3D NULL;

int nb =3D 0;



f =3D fopen(filename1, "r");

f1 =3D fopen(filename2, "r");

if (f && f1)

{

while (fgets(s, MAX_SIZE, f))

{

a =3D 0;

rewind(f1);

while (fgets(s1, MAX_SIZE, f1))

{

if (is_same(s, s1))

{

a =3D 1;

break;

}

}

if (!a)

{

nb++;

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

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

res[nb] =3D 0;

}

}

fclose(f);

fclose(f1);

}

return res;

}


void display_tab(char** tab)

{

while (tab && *tab)

{

printf("%s\n", *tab);

tab++;

}

}



int main()

{

char** res =3D NULL;

char** intersect =3D NULL;

char input[32];

int i;


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

{

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

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


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

display_tab(res);

free_tab(res);

}
return 0;

}


Apr=E8s la compilation et l'ex=E9cution, 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=E9sultat souhait=E9 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=E9vis=E9 mon code beaucoup des fois mais je ne trouve pas pourquoi
je n'obtiens pas le r=E9sultat souhait=E9.

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.

4 réponses

Avatar
anc break
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.
Avatar
domi
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...
Avatar
anc break
>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.
Avatar
domi
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..