OVH Cloud OVH Cloud

Débutant - passer de gets à fgets

11 réponses
Avatar
bpascal123
Bonnes f=EAtes,

Je rencontre une difficult=E9 sur l'exercice 8.23 de ce tutoriel :
http://www.ltam.lu/Tutoriel_Ansi_C/
(il faut naviguer manuellement, il n'est pas possible de copier-coller
l'adresse qui m=E8ne directement =E0 l'exercice, d'ailleurs sans rapport
avec ce groupe, quelqu'un saurait me dire comment s'est possible de
naviguer dans diff=E9rentes pages d'un site sans que la barre d'adresse
indique l'adresse de la page???).

Bref, pour en revenir =E0 8.23, l'auteur n'a pas mis =E0 jour le site
(tant mieux, =E7a ajoute un peu de piment et des fois un peu d'injure =E0
la blessure de ne pas y arriver...). Le code de l'auteur fonctionne
tr=E8s bien et le r=E9sultat est coh=E9rent. Mais il fait appel =E0 "gets".

Gets ne semble plus tr=E8s populaire pour cause de s=E9curit=E9, je pense
que c'est C99 ou Posix qui veut, =E7=E0, je ne connais pas tr=E8s bien la
diff=E9rence entre les 2.

Voici mon code, qui inclut fgets et qui sur le m=EAme principe
fonctionne tr=E8s bien avec les 2 exercices pr=E9c=E9dents qui sont
l=E9g=E8rement diff=E9rent de l'exercice 8.23 (remplacement de chaine de
caract=E8re...) :

/* EXERCICE 8.23
Ecrire un programme qui remplace toutes les occurrences d'une cha=EEne
de caract=E8res CH1 par la cha=EEne CH2 dans une cha=EEne de caract=E8res S=
UJ.
Utiliser une cha=EEne de sauvegarde FIN pendant le remplacement.
*/

#include <stdio.h>

int main(void)
{

char Suj[50] ; /* Chaine sujet */
char Ch1[50] ; /* Chaine =E0 rechercher */
char Ch2[50] ; /* Chaine =E0 remplacer */
char Fin[50] ; /* Chaine de sauvegarde pour la fin de sujet*/

int i, j, in ; /* variable d'aide */

/* SAISIE SUJET, CHAINE 1, 2 ...*/

printf("\n\nEntrez une chaine sujet : ") ;
fgets(Suj, 50, stdin) ;

/* Suppression du '\n' dans le buffer lu par fgets*/

for ( i =3D 0 ; Suj[i] ; i++ )
;
i-- ;
Suj[i] =3D '\0' ;

printf("\nEntrez une chaine objet Ch1 a rechercher dans sujet :") ;
fgets(Ch1, 50, stdin) ;

/* Suppression du '\n' dans le buffer lu par fgets*/

for ( i =3D 0 ; Ch1[i] ; i++ )
;
i-- ;
Ch1[i] =3D '\0' ;

printf("\nEntrez une chaine objet Ch2 a rechercher dans sujet :") ;
fgets(Ch2, 50, stdin) ;

/* Suppression du '\n' dans le buffer lu par fgets*/

for ( i =3D 0 ; Ch2[i] ; i++ )
;
i-- ;
Ch2[i] =3D '\0' ;

/* */
/* Boucle de recherche et remplacement */
/* */

for ( i =3D 0 ; Suj[i] ; i++)
{
if ( Suj[i] =3D=3D Ch1[0] )
{
for ( j =3D 1 ; Ch1[i] && (Ch1[i] =3D=3D Suj[i+j]) ; j++)
;
if ( Ch1[j] =3D=3D '\0' )
{
printf("\nTrouve!!!") ;
/* sauvegarde de la fin de Suj dans Fin */
for ( in =3D 0 ; Suj[i+j+in] ; in++ )
Fin[in] =3D Suj[i+j+in] ;
Fin[in] =3D '\0' ;

/* copie de Ch2 ds Suj */
for ( in =3D 0 ; Ch2[in] ; in++, i++ )
Suj[i] =3D Ch2[in] ;

/*recopier Fin dans Suj */
for ( in =3D 0 ; Fin[in] ; in++)
Suj[i+in] =3D Fin[in] ;
Suj[i+in] =3D '\0' ;
i-- ;
}
}
}

printf("\nResultat : %s", Suj) ;

printf("\n\n") ;

return 0 ;
}

-o-

S'il vous pla=EEt, sauf si c'est utile pour d'autres membres du groupe,
ne changez pas compl=E8tement le code dans la mesure ou le tout me
semble "carr=E9" et coh=E9rent, je connais d=E9j=E0 les pointeurs mais je v=
eux
m'en sortir sans dans la mesure ou la solution de l'exercice qui
correspond au chapitre en cours n'inclut pas des choses compliqu=E9es
qui rendent le code plus performant ou moins long...je sais que =E7a
doit d=E9manger certains mais dans l'imm=E9diat, je ne vais pas me
concentrer sur une r=E9ponse trop "experte".

Juste pour dire, il me semble que le non-fonctionnement provient de la
premi=E8re partie fgets avec recherche du '\n', or fgets fonctionne tr=E8s
bien de la m=EAme mani=E8re dans les 2 exercices pr=E9c=E9dents. ( printf
("\Trouv=E9!!!") ) s'affiche. Peut-=EAtre cette manipulation ne convient
pas dans cette situation. Pour quelle raison?

Merci,

Pascal

1 réponse

1 2
Avatar
Antoine Leca
Benoit Izac écrivit :
le 21/12/2009 à 17:47, bpascal a écrit dans le message
:
Je rencontre une difficulté sur l'exercice 8.23 de ce tutoriel :
http://www.ltam.lu/Tutoriel_Ansi_C/
(il faut naviguer manuellement, il n'est pas possible de copier-coller
l'adresse qui mène directement à l'exercice, d'ailleurs sans rapport
avec ce groupe, quelqu'un saurait me dire comment s'est possible de
naviguer dans différentes pages d'un site sans que la barre d'adresse
indique l'adresse de la page???).



Il suffit de n'afficher que la frame (traduction ?) de droite.



Cadre.

<http://www.ltam.lu/Tutoriel_Ansi_C/prg-c76.htm>



Plutôt http://www.ltam.lu/Tutoriel_Ansi_C/solex101.htm pour la solution
dont s'inspire Pascal,
et http://www.ltam.lu/Tutoriel_Ansi_C/prg-c87.htm#Heading193 pour le
sujet de l'exercice.


Antoine
1 2