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

debutant - arithmetic pointeurs caracterers

4 réponses
Avatar
bpascal123
Debutant : arithmetic pointeurs

Bonjour,

Le code ci-dessous n'affiche ni message d'erreur ni resultat. J'ai
repris le code du tutoriel des posts r=E9cents pr=E9c=E9dents d'un exercice
que je trouve int=E9ressant d'un point de vue algorithmes.

Dans les posts pr=E9c=E9dents, il =E9tait sujet d'une confusion dans la
saisie clavier et =E9tourderies et dans ce post, je n'exclue pas
l'=E9tourderie mais j'ai juste chang=E9 l'arithm=E9tique tableaux par
l'arithm=E9tique pointeurs. Sur ce mod=E8le, l'arithm=E9tique tableaux
fonctionne tr=E8s bien.


/*
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 Ch1[50] ; /* chaine pr rechercher */
char *pCh1 ; /* ptrs vers Ch1 */
char Ch2[50] ; /* chaine pr remplacer Ch1 */
char *pCh2 ;
char Suj[50] ; /* chaine sujet */
char *pSuj ;
char Fin[50] ; /* chaine de sauvegarde */
char *pFin ;

/* Saisies... je dois inclure un fgets !=3D NULL pr s=E9curiser
fgets.... je ne me concentre pas =E0 cet instant sur le blindage du
code, juste que ce soit =E9tanche... */

printf("\n\nEntrez une chaine Sujet (Max.50 caracteres) : ") ;
fgets(Suj, 50, stdin) ;

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

printf("\nEntrez une chaine Ch2 a remplacer ds sujet : ") ;
fgets(Ch2, 50, stdin) ;

/* Suppression ds Ch1, Ch2 et Suj du '\n' mis ds le buffer par fgets
*/

for ( pCh1 =3D Ch1 ; *pCh1 ; pCh1++ )
;
pCh1-- ;
*pCh1 =3D '\0' ;

for ( pCh2 =3D Ch2 ; *pCh2 ; pCh2++ )
;
pCh2 -- ;
*pCh2 =3D '\0' ;

for ( pSuj =3D Suj ; *Suj ; pSuj++ )
;
pSuj-- ;
*pSuj =3D '\0' ;

/* Boucles de traitement de caracteres AVEC POINTEURS */

for ( pSuj =3D Suj, pCh1 =3D Ch1 ; *Suj ; pSuj++ )
{
if ( *pSuj =3D=3D *pCh1 )
{
for ( pCh1 =3D Ch1+1 ; *pCh1 ; pCh1++ )
;
if ( *pCh1 =3D=3D '\0' )
{
/* copie de fin Suj selon longueur Ch1 dans Fin */
for ( pFin =3D Fin ; *pFin ; pFin++ )
*pFin =3D *(pSuj+(pCh1-Ch1)+(pFin-Fin)) ;

/* copie de Ch2 dans Suj */
for ( pCh2 =3D Ch2 ; *pCh2 ; pCh2++ )
*pSuj =3D *pCh2 ;

/* copie de Fin dans Suj */
for ( pFin =3D Fin ; *pFin ; pFin++ )
*(pSuj+(pFin-Fin)) =3D *pFin ;
*pSuj =3D '\0' ;
}
}
}

/*Affichage */

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

printf("\n\n") ;

return 0 ;
}

Merci et bonnes f=EAtes de fin d'ann=E9e,

Pascal Baro

4 réponses

Avatar
Samuel Devulder
a écrit :

for ( pCh1 = Ch1 ; *pCh1 ; pCh1++ )
;
pCh1-- ;
*pCh1 = '' ;



Comme d'hab: que se passe t'il si la chaine saisie est vide (c-a-d
qu'elle contient '' dès le début). Mais bon c pas le fond du problème.
Si tu veux un conseil: laisse tomber les i/o quand tu veux tester un
algo. Mets des chaines constantes dans le code et ton prog ce sera plus
simple et tu pourra te concentrer sur les erreurs de ton algo.


*pSuj = '' ;

/* Boucles de traitement de caracteres AVEC POINTEURS */

for ( pSuj = Suj, pCh1 = Ch1 ; *Suj ; pSuj++ )


^^^^

Suj n'a pas l'air de changer beaucoup dans la boucle. Tu n'aurais pas
fait une faute en confondant *Suj avec *pSuj?

Conseil de noel: Laisse tomber le test et les conclusion "pas d'erreur"
mais "ne fait rien". Ca ne veut rien dire. Essaye un débuggeur pas à pas
si tu veux comprendre ce qu'il se passe.

Cadeau de noel: Utilise un IDE "moderne" (exemple
http://www.eclipse.org/cdt/). Avec un tel ide tu as un débuggeur qui
permet de faire tourner ton prog pas à pas. C'est comme cela que tu
comprendra le pb dans ton algo et que tu progressera.

Allez fais toi plaisir pour noel. Telecharge ceci:
http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/SR1/eclipse-cpp-galileo-SR1-win32.zip

Dezippe le et lance le. Crée un projet C et ecris-y ton code. Enfin
lance le débuggeur pour voir "tourner" ton prog. Tu va vite comprendre
les erreurs.

sam.
Avatar
-ed-
On 24 déc, 13:12, ""
wrote:

Le code ci-dessous n'affiche ni message d'erreur ni resultat. J'ai



J'ai quand même ça ...

-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: binDebughello.exe
C:devhellomain.c: In function `main':
C:devhellomain.c:59: warning: will never be executed
Output size is 19.39 KB
Process terminated with status 0 (0 minutes, 4 seconds)
0 errors, 1 warnings


Rappel :

http://www.bien-programmer.fr/codage.php#cfg_compilo

Ensuite, j'ai testé l'exécution, clairement, on est coincé dans une
boucle. Il y a donc un bug dans le programme (algo, codage...)

Ta méthode de suppression du 'n' n'est pas bonne dans tous les cas.
Elle te fonctionne que dans les cas simples (saisie 'normale' sans
dépassement). On t'a déjà expliqué 3000 fois comment faire. Pourquo i
cet entêtement ? On est pas enclin à t'aider si tu ne tiens pas compte
des réponses apportées...

for (pSuj = Suj, pCh1 = Ch1; *Suj; pSuj++)

*Suj est un invariant. C'est probablement un bug (boucle infinie). Tu
veux dire

for (pSuj = Suj, pCh1 = Ch1; *pSuj; pSuj++)

?
Avatar
bpascal123
Avatar
bpascal123
On 1 jan, 19:51, ""
wrote:
merci



Ma réponse ne permet pas de poursuivre le débat, c'est juste que j'ai
commencé à refaire ce code selon vos directives et conseils, mais j'ai
également voulu insérer une fonction pour une saisie avec fgets sans
'n' le code me semble cohérent, cependant la fonction de saisie d'un
tableau de caractère, c-à-d une fonction char ne me semble pas
évidente en tant que débutant à implémenter.

Et puis j'ai mis de côté tout ce qui concerne la saisie de
characteres, ça commençait à faire trop...donc je suis passé
momentanément à des exercices classique avec "int"... Et puis avec la
fatigue de l'hiver, je me suis pas fait vraiment violence tout comme
la plupart sur fr comp group c ou avez-vous migré sur comp group c
anglais? à suivre...