Copie incorrect ?

Résolu
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   -  
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour
je viens demander l'avis aux experts, pourquoi le premier caractère du tableau n'est pas copié ? enfin je trouve ça un peu bizarre quelqu'un pourrais éclairer ma lanterne ?
Merci & à bientôt

#include <stdio.h>
#include <stdlib.h>

int main(void){
	
	int i = 0;
	char Tab_B[] = {"S alut C omment tu v as\0"};
	char *pTab_A = malloc( sizeof(Tab_B) );

	
	/*	Copie & décalage */
	char *pAlias = Tab_B;
	while(*pAlias++){
		if(*pAlias != ' '){
			pTab_A[i++]=*pAlias;
		}
	}
	*pAlias='\0';
	
	/*	Contôle	*/
	printf("Résultat = %s\n",pTab_A);
	
	free(pTab_A);
	pTab_A = NULL;
	
	if(pTab_A != NULL){
		printf("No Free\n");
		return (EXIT_FAILURE);
	}
	
	return (EXIT_SUCCESS);
}


--
Toute connaissance est une réponse à une question.

2 réponses

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Sambia,

    le père a raison, tu incrémentes le pointeur avant de copier.

    Cependant, si tu veux incrémenter ton pointeur dans la boucle while, tu peux utiliser les propriétés de l'incrémentation postfix, et en profiter pour y incrémenter aussi l'autre pointeur et réaliser l'affectation d'un coup, ainsi que le test et la copie du caractère '\0' de terminaison de chaîne.

    Cela donne un code comme cela :

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void){
        char Tab_B[] = {"S alut C omment tu v as\0"};
        char * A = malloc( sizeof(Tab_B) );
        
        /*  Copie & décalage */
        char * pB = Tab_B;  /* pointeur vers le 1er élément de Tab_B */
        char * pA = A;      /* pointeur vers A */
    
        while ((*pA++ = *pB++)) {
            if (*(pA - 1) == ' ')   /* si on a copié un espace */
                pA--;               /* on l'efface             */
        }
        
        /*  Contrôle    */                                                                                                                                                                                             
        printf("Résultat = %s\n", A);
    
        free(A);
        A = NULL;
    
        return 0;
    }


    Dal
    1
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Par rapport à la fonction free, et à ta discussion avec le père à ce sujet, effectivement, la fonction free ne change pas la valeur du pointeur.

      http://www.cplusplus.com/reference/cstdlib/free/

      c'est à toi de le mettre à NULL après avoir désalloué la mémoire, comme tu le fais, si cela est utile dans ton code d'identifier ce pointeur comme étant désormais NULL.


      Dal
      0
    2. sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   50
       
      Merci @Dal, je n'avais pas pensé à cette façon de faire, en même temps je voulais juste corrigé le code ci-dessous (-_-) en utilisant une autre approche mais j'admets ton astuce est efficace, encore merci à tous

      //
      char *tab1;  
      char tabdada[15]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'};
       
                           for(i=0;i<14;i++)
                              {
                                  for(j=0;j<14;j++)
                                  {
                                      if(tabdada[j]!=' ')
                                      {
                                          tab1[i]=tabdada[j];
                                          tabdada[j]=' ';
                                          break;
                                      }
                                  }
      
      0
  2. Utilisateur anonyme
     
    Bonjour

    Le premier caractère n'est pas recopié parce que tu incrémentes le pointeur AVANT de recopier :
    while(*pAlias++){
    0
    1. Utilisateur anonyme
       
      P.S. à quoi sert de tester
      if(pTab_A != NULL)
      immédiatement après avoir fait
      pTab_A = NULL;
      ?
      0
    2. sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   50
       
      Bonjour , merci de ta réponse
      le
       if(pTab_A != NULL) 
      ne sert rien,
      dans mon précédent code elle me permettait de contrôle la variable si elle est bien à NULL.
      0