Où est l'abbhération informatique sur ces ***** de pointeurs

Signaler
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
-
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
-
Salut à tous et à toutes,
Je ne sais pas comment j'aurais du nommer le topique mais en fait pouvez vous me dire où est l'abbhération informatique là dedans :

#include <stdio.h>

void CopieChaine(char * pdest, char * psrc)
{
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
}

if(*psrc == '\0')
pdest[*psrc] = '\0';
}

int main()
{
char source[512]/*="Un beau dimanche"*/;
char *destination;
char indic='o';

do
{
// on rentre la chaine
printf("Veuillez rentrer une chaine de caractere :\n");
gets(source);

printf("%s\n", source);

CopieChaine(destination, source);

// on affiche la source et la destination
printf("Chaine source = %s", source);
printf("\nChaine destination = %s\n", destination);

printf("'q' pour quitter\n");
scanf("%c", &indic);

}while(indic != 'q');

return 0;
}

Mon prof prétend que ce qui est écrit en rouge ne devrait théoriquement pas marché, car il nous a dit que *chose renvoie en fait une adresse donc dans cet exemple eh ben , je devrais l'avoir dans l'os, mais si vous compilez ce programme, miracle, il marche à merveille... et si je remplace *pdest++ et *psrc++ par pdest++ par psrc++, mon programme ne fonctionne plus

Pouvez vous m'expliquer en détail ces quelques lignes. Merci...

4 réponses

Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

pas obliger de faire 3 topics pour poser ta question !
ps : Rien est en rouge :)
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
Y'a aucun problème au niveau de la compilation à mon avis. Par contre c'est stupide de faire
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
Ce que l'on veut ici c'est une copie de chaîne
donc
psrc++;
pdest++;
Sinon, c'est balot, le programme ne plante pas mais aucune copie n'est faite, seule la valeure '\0'-1 sera copiée dans *pdest, les pointeurs ne serait pas incrémentée, pour sortir de la boucle il faudrait attendre que psrc[0] vale '\0'.
Puis la condition
if(*psrc == '\0')
est inutile puisque l'on sorte du while avec pour valeur de *psrc 0. Mettre directement
pdest[*psrc] = '\0';

Voilà, pas grand chose à dire de plus.

Bouba.
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
11
Y'a 3 topics parce mon pc a planté.
Mon programme fonctionne car quand j'écris coucou, il me renvoyé bien en sortie coucou.
En fait, on pouvait remplacer ça :

while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
}

par ça :
while(*psrc) // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
psrc++; // On incremente psrc
pdest++; // On incremente pdest
}

ou encore
while(*pdest++ == *psrc++)

Enfin, marci quand meme
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
ce qui m'étonne le plus dans ce code , c'est qu'il n'y a pas de réservation de mémoire pour la destination. déjà à la déclaration
char* destination = 0;
en rentrant dans la fonction :
-si destination est différent de 0 on désalloue la mémoire et on refait une allocation de la taille de source. puis on recopie.

louis14