Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

debutant - arithmetic pointeurs caracterers

1 view
Skip to first unread message

bpasc...@googlemail.com

unread,
Dec 24, 2009, 7:12:13 AM12/24/09
to
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 SUJ.
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("\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 = Ch1 ; *pCh1 ; pCh1++ )
;
pCh1-- ;
*pCh1 = '\0' ;

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

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

/* 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 == '\0' )
{
/* 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 = '\0' ;
}
}
}

/*Affichage */

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

printf("\n\n") ;

return 0 ;
}

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

Pascal Baro

Samuel Devulder

unread,
Dec 24, 2009, 7:36:18 AM12/24/09
to
bpasc...@googlemail.com a �crit :

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

Comme d'hab: que se passe t'il si la chaine saisie est vide (c-a-d
qu'elle contient '\0' 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 = '\0' ;
>
> /* 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-

unread,
Dec 25, 2009, 6:32:28 AM12/25/09
to
On 24 déc, 13:12, "bpascal...@googlemail.com"
<bpascal...@googlemail.com> 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: bin\Debug\hello.exe
C:\dev\hello\main.c: In function `main':
C:\dev\hello\main.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. Pourquoi
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++)

?

bpasc...@googlemail.com

unread,
Jan 1, 2010, 2:51:22 PM1/1/10
to
merci

bpasc...@googlemail.com

unread,
Jan 5, 2010, 8:07:09 AM1/5/10
to
On 1 jan, 19:51, "bpascal...@googlemail.com"
<bpascal...@googlemail.com> 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...

0 new messages