debutant - arithmetic pointeurs caracterers

Le
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écents précédents d'un exercice
que je trouve intéressant d'un point de vue algorithmes.

Dans les posts précédents, il était sujet d'une confusion dans la
saisie clavier et étourderies et dans ce post, je n'exclue pas
l'étourderie mais j'ai juste changé l'arithmétique tableaux par
l'arithmétique pointeurs. Sur ce modèle, l'arithmétique tableaux
fonctionne très bien.


/*
Ecrire un programme qui remplace toutes les occurrences d'une chaîne
de caractères CH1 par la chaîne CH2 dans une chaîne de caractères S=
UJ.
Utiliser une chaîne 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 != NULL pr sécuriser
fgets. je ne me concentre pas à cet instant sur le blindage du
code, juste que ce soit étanche */

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

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

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

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

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

for ( pCh2 = Ch2 ; *pCh2 ; pCh2++ )
;
pCh2 -- ;
*pCh2 = '' ;

for ( pSuj = Suj ; *Suj ; pSuj++ )
;
pSuj-- ;
*pSuj = '' ;

/* Boucles de traitement de caracteres AVEC POINTEURS */

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

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

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

/*Affichage */

printf("Resultat : %s", Suj) ;

printf("") ;

return 0 ;
}

Merci et bonnes fêtes de fin d'année,

Pascal Baro
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
Samuel Devulder
Le #20829801
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.
-ed-
Le #20832721
On 24 déc, 13:12, ""

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++)

?
bpascal123
bpascal123
Le #20901671
On 1 jan, 19:51, ""
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...
Publicité
Poster une réponse
Anonyme