Difference entre strncpy et memcpy (langage C)
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Difference entre strncpy et memcpy (langage C)



  1. #1
    deyni

    Difference entre strncpy et memcpy (langage C)


    ------

    Bonjour,

    je ne vois pas la difference entre memcpy et strncpy.
    Pour moi elles font la même chose.

    J'ai cru comprendre quelquechose comme le caractère NULL non repéré par memcpy, mais je ne sais pas trop.

    Un truc que je ne comprends pas:
    Code:
    tab[i] = malloc( 30*sizeof( char ) );
    tab[i] = memcpy(tab[i], 2, 30 - 2);
    ( tab[i] ) [30 - 2] = '\0'
    Que fait ce bout de code? Et que veut dire la 3eme ligne?

    Merci.

    -----
    Deynid'oiseaux partout !! :rire:

  2. #2
    Jack
    Modérateur

    Re : Difference entre strncpy et memcpy (langage C)

    strncpy, comme son nom le laisse penser (str = string = chaines), c'est pour copier des chaines. Une chaîne en C est terminée par 0. strncpy arrête donc la copie au premier 0 trouvé, sinon au nième caractère passé en paramètre.

    A+
    Dernière modification par Jack ; 22/10/2012 à 16h06.

  3. #3
    kwariz

    Re : Difference entre strncpy et memcpy (langage C)

    Bonjour,

    pour la différence entre strncpy et memcpy : c'est ça. memcpy copie exactement n octets de source vers destination avec memcpy(destibation, source, n) alors que strncpy copie au plus n octets de source vers destination la copie s'arrêtant si un octet copié vaut 0.
    Juste pour clarifier le vocabulaire, NULL n'est utilisé que dans le cadre des pointeurs. On parle du caractère nul, celui de dont le code ascii est 0. En C tu peux utiliser aussi bien la valeur 0 que le caractère '\0'.

    Tu as tout un tas de fonctions de dispo dans ce qu'on appelle la libc. Celles qui commencent par str traitent leurs arguments comme des chaines de caractères terminées par un caractère nul, elles ont en général un équivalent en strn qui ajoute un argument de taille maximum comme strcpy et strncpy.
    Les fonctions qui commencent par mem quant à elles traitent leurs arguments comme des suites d'octets sans se préoccuper de leur signification, c'est pourquoi la famille de fonctions memX a toujours un argument pour spécifier la taille des zones mémoires.

    Code:
    tab[i] = malloc( 30*sizeof( char ) );
    tu alloues un espace mémoire de 30 char, tu pourras donc y stocker une chaine de 29 caractères maximum (à cause du 0 terminal). Pour accéder aux caractère tu pourras taper tab[i][0] pour le premier caractère jusqu'à tab[i][29] pour le dernier octets (qui s'il est utilisé ne pourra être que le caractère '\0') ou tab[i][28] le dernier caractère utile.

    Code:
    tab[i] = memcpy(tab[i], 2, 30 - 2);
    Il y a une erreur ... le second paramètre ne peut être un entier, il doit impérativement être une adresse valide (=un pointeur).
    En supposant une erreur de recopie, on peut imaginer que ce memcpy est utilisé pour copier 28 octets d'une chaine à partir de son troisième caractère dans tab[i], sans toutefois se préoccuper de la présence ou non d'un caractère nul.

    Code:
    ( tab[i] ) [30 - 2] = '\0'
    Que l'on peut aussi écrire en tab[i][28], on initialise le 29ème caractère de la chaine tab[i] avec le caractère nul pour s'assurer que tab[i] est bien une chaine à zéro terminal (donc par la suite manipulable avec les fonctions de la famille strX).
    On retrouve souvent ce genre de code après un memcpy ou un strncpy pour être absolument certain d'avoir une chaine à zéro terminal.

    Remarque: avec ce code tu perds (dans le sens tu as alloué mais tu n'utilises jamais) un octet par tab[i]. Tu vois pourquoi ?
    Dernière modification par kwariz ; 22/10/2012 à 16h25.

  4. #4
    deyni

    Re : Difference entre strncpy et memcpy (langage C)

    Bonjour, merci une fois de plus de vos réponses.

    J'ai bien compris le truc, et j'ai même prédis ce que ferai le programme

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(){
    	int i = 0;
    	char tab[5] = {'a', 'b', '\0', 'c', 'd'};
    	//char tab[5] = {1, 2, 3, 4, 5};
    	//char t[] = {"a", "b", "c", "d"};
    	
    	char tab2[5];
    	char tab3[5];
    	memcpy(tab2, tab, 5);
    	strncpy(tab3, tab, 5);
    	
    	printf("Le tab2 avec le memcpy contient: ");
    	for ( i = 0; i < 5; i++){
    		printf("%c", tab2[i]);
    	}
    	
    	printf( "\n" ); 
    	
    	printf("Le tab3 avec le strncpy contient: "); 
    	for ( i = 0; i < 5; i++){
    		printf("%c", tab3[i]);
    		}
    	
    	printf("\n");
    	
    	printf("Le tab, tableau originel contient: ");
    	for ( i = 0; i < 5; i++){
    		printf("%c", tab[i]);
    		}
    	
    	printf("\n");
    	 
    	return 0;
    }
    il affiche :
    Code:
    Le tab2 avec le memcpy contient: ab cd
    Le tab3 avec le strncpy contient: ab
    Le tab, tableau originel contient: ab cd
    Merci bien.
    Deynid'oiseaux partout !! :rire:

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Difference entre structure, pointeur, tableau (langage C).
    Par deyni dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 12/10/2012, 15h23
  2. Langage C - printf & puts : différence ?
    Par tango88 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 31/01/2012, 22h51
  3. C18, utilisation de memcpy
    Par amoniaque dans le forum Électronique
    Réponses: 1
    Dernier message: 17/01/2011, 17h44
  4. différence entre la puissance en kwh entre tuli et nunna?
    Par invite6894a857 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 4
    Dernier message: 04/09/2008, 16h16
  5. Réponses: 21
    Dernier message: 18/08/2008, 14h16