Copie incorrect ?

Résolu/Fermé
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 3 juin 2014 à 10:54
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 3 juin 2014 à 13:31
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);
}


A voir également:

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
3 juin 2014 à 13:05
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
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 3/06/2014 à 13:19
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
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
3 juin 2014 à 13:31
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
Utilisateur anonyme
3 juin 2014 à 11:25
Bonjour

Le premier caractère n'est pas recopié parce que tu incrémentes le pointeur AVANT de recopier :
while(*pAlias++){
0
Utilisateur anonyme
3 juin 2014 à 11:28
P.S. à quoi sert de tester
if(pTab_A != NULL)
immédiatement après avoir fait
pTab_A = NULL;
?
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 3/06/2014 à 11:42
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