Demande d' aide sur les pointeurs

Demande d' aide sur les pointeurs - C++ - Programmation

Marsh Posté le 06-02-2006 à 18:51:27    

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  
  __fpurge(stdin);
   
  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);
 
  __fpurge(stdin);
   
  // on quitte ?  
  fflush(stdin);
   
  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...
 
Pouvez vous m'expliquer en détail ces quelques lignes. Merci...

Reply

Marsh Posté le 06-02-2006 à 18:51:27   

Reply

Marsh Posté le 06-02-2006 à 19:19:13    

char* destination ne pointe sur rien de valide, il y a un comportement indéfini.
Sinon, CopieChaine est pour le moins curieuse ...
Ajoutons à cela le double combo de la part du prof apparemment ( gets, fflush(stdin) ), et de plus en plus fort __fpurge(stdin), et j'en oublie ...
Poste dans la cat C, ça va les dérider un peu :)

Reply

Marsh Posté le 06-02-2006 à 19:36:25    

quantic_blade a écrit :

Salut à tous et à toutes,
 
  __fpurge(stdin);
   
  gets(source);
   
   
  __fpurge(stdin);
   
  // on quitte ?  
  fflush(stdin);


putain, un prof pareil, je l'enverrais bien en Afghanistan avec une pancarte à l'effigie de Mahomet en turban en forme de bombe [:petrus75]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 06-02-2006 à 20:00:13    

La partie en rouge c'est la seule partie qui m'a l'air correcte, c'est normal ?
C'est identique à ça en fait :

Code :
  1. void CopieChaine(char * pdest, char * psrc)
  2. {
  3. while(*psrc) // Tant que le caractere de la chaine source n'est pas  
  4.       // un ensemble vide  
  5. {
  6.   *pdest = *psrc; // On met la valeur de psrc dans pdest  
  7.   psrc++; // On incremente psrc  
  8.   pdest++; // On incremente pdest  
  9. }
  10.  
  11. if(*psrc == 0)
  12.   *pdest = 0; 
  13. }

Reply

Marsh Posté le 06-02-2006 à 20:15:46    

En fait la partie main(), je l'ai code à l'arrache parce qu'a la base j'utilise scanf que j'ai remplace mais j'ai pas corrige tout le code, non en fait c'est où est l'erreur dans CopieChaine parce que le prof prétend que  
 
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';
 
est un illogisme totale

Message cité 1 fois
Message édité par quantic_blade le 06-02-2006 à 20:18:25
Reply

Marsh Posté le 06-02-2006 à 20:19:58    

sinon faudrait apprendre à ton prof l'existence de strcpy() aussi
 
edit:  
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas  
                          // un ensemble vide  
 
c'est le prof qui appelle ça "ensemble vide" ? [:pingouino]


Message édité par Harkonnen le 06-02-2006 à 20:20:58

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 06-02-2006 à 20:34:13    

Pour le refus d'utiliser strcpy, je suppose que c'est pour apprendre à utiliser les chaînes de caractères.  
Sinon c'est très mal écris mais ce n’est pas faux donc comment tu veux que l'on te dise où est l'erreur ?
Plus sérieusement, compare avec ce que j'ai tapé pour voir où ce que tu fais a l'air étrange.

Reply

Marsh Posté le 06-02-2006 à 20:47:45    

quantic_blade a écrit :

En fait la partie main(), je l'ai code à l'arrache parce qu'a la base j'utilise scanf que j'ai remplace mais j'ai pas corrige tout le code, non en fait c'est où est l'erreur dans CopieChaine parce que le prof prétend que  
 

Code :
  1. while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas  
  2.                           // un ensemble vide  
  3. {
  4.   *pdest = *psrc; // On met la valeur de psrc dans pdest  
  5.   *psrc++; // On incremente psrc  
  6.   *pdest++; // On incremente pdest  
  7. }
  8.  
  9. if(*psrc == '\0')
  10.   pdest[*psrc] = '\0';


 
est un illogisme totale


 
le déréférencement aux lignes 5 et 6 est inutile, le test final est inutile, et l'instruction à mettre est : *pdest = 0;
Ce code s'écrit habituellement en une ligne, avec le prototype suivant :
 
void CopieChaine( char* dest, char const* src )
{
    while( *dest++ = *src++ );
}
 
voire en C99 :
 
void CopieChaine( char* restrict dest, char const* restrict src )
{
    while( *dest++ = *src++ );
}


Message édité par ++fab le 06-02-2006 à 20:56:34
Reply

Marsh Posté le 06-02-2006 à 20:53:03    

et aussi
 

Code :
  1. char * CopieChaine( char* dest, char const* src )
  2. {
  3.     while( *p++ = *q++ );
  4.     return dest;
  5. }


 
pratique pour condenser du code, un bon paquet des fonctions de string.h retournent l'adresse de la chaine modifiée


Message édité par skelter le 06-02-2006 à 20:53:41
Reply

Marsh Posté le 06-02-2006 à 21:09:51    

Merci, donc en fait j'avais bon , mais c'etait tres mal codé.
Ce qui est triste dans l'histoire, tu vois c'est que je fais de la prog depuis 1998 et que je commence à coder avec DX9 et DX10.
Alors je connais pas mal de truc sur les pointeurs et tout le toutim, mais le prof s'explique tellement bien ,qu'en fait je ne comprends plus rien de ce que je fait. Enfin de toute façon après le  BTS j'aurais tout le loisir de me repencher sur les points que j'ai admit sans jamais cherché à les comprendre...
 
Enfin le coup du
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';  
}
 
en  
 
void CopieChaine(char* pdest, char* psrc)
{
    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  
 }  
   
 if(*psrc == 0)  
  *pdest = 0;  
}
 
Que le prof ne l'ai pas vu est inacceptable parce qu'un prof linuxien qui dit savoir codé et qui ne voit pas ça, on finirait par se demander s'il vaut vraiment le coup d'être prof  

Reply

Marsh Posté le 06-02-2006 à 21:09:51   

Reply

Marsh Posté le 06-02-2006 à 21:25:09    

Tu peux aussi, (comme il t'a déjà été dit) virer le  
if (*psrc == 0)
le test est forcement vrai car pour sortir de la boucle while il faut que *psrc soit égal à 0.


Message édité par Trap D le 06-02-2006 à 21:26:48
Reply

Marsh Posté le 07-02-2006 à 12:49:44    

bah oui, *pointeur++ = (*pointeur)++ et pas *(pointeur++)
or, pour parcourir la chaine, ca doit "un peu" mieux marcher si on modifie l'indice/l'adresse à laquelle on accède
le dernier test ne sert en effet à rien: si c'est '\0' tu testes la fin de chaine, or on y est deja. si c'est 0, ca doit être une erreur, car je vois pas trop quel sens ça aurait
donc tu mets directement *pdest = '\0'
 
en revanche, tu peux résoudre facilement ce truc-là en l'incluant dans la boucle si tu passes par un do while() au lieun d'un while()

Reply

Marsh Posté le 07-02-2006 à 13:00:14    

trevor a écrit :

bah oui, *pointeur++ = (*pointeur)++ et pas *(pointeur++)


 
 
ah ?

Reply

Marsh Posté le 07-02-2006 à 13:29:47    

autant pour moi... je me suis trompé

Reply

Marsh Posté le 07-02-2006 à 13:37:24    

de toute facon c'est naze comme style d'ecriture

Reply

Marsh Posté le 21-02-2006 à 16:37:01    

Bonjour,
 
une simple remarque au sujet de ton programme, la variable "char *destination;"  est un pointeur sur une zone de memoire
de type "char" donc si tu copie ta chaine source vers ta chaine destination sans avoir allouer de la memoire avec une
fonction du type malloc or calloc tu vas ecraser tout les donnees et le code de ton programme au moment de l'execution
de ta fonction de copie!
 
Apres avoir alloue la memoire pour ta chaine de destination il faut utiliser une founction de type memset pour initialiser
la zone a 0x00 ce qui evite de gerer le caracter de fin de chaine '\0' dans la fonction de copie.
 
A+ :)  
 

chrisbk a écrit :

de toute facon c'est naze comme style d'ecriture



---------------
Suntzu
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed