Strncpy () est-il une spécialisation de memcpy ()?

Juste curieux de savoir (comme nous utilisons souvent ces fonctions). Je ne vois aucune différence pratique entre strncpy () et memcpy () . Ne vaut-il pas la peine de le dire efficacement?

char* strncpy (char *dst, const char *src, size_t size) { return (char*)memcpy(dst, src, size); } 

Ou est-ce que je manque un effet secondaire? Il y a une question similaire, mais nous n’avons pas trouvé de réponse exacte.

Il y a une différence, voir cette partie de la page de strncpy vous avez strncpy (emphase la mienne):

Copie les premiers chiffres de la source vers la destination. Si la fin de la chaîne C source (signalée par un caractère nul) est trouvée avant que les caractères numériques aient été copiés, la destination est complétée de zéros jusqu’à ce qu’un total de caractères numériques y ait été écrit.

Donc, si la chaîne à copier est plus courte que la limite, strncpy zéro pendant que memcpy lit au-delà de la limite (en invoquant éventuellement un comportement indéfini).

Non, ils ne sont pas les mêmes.

De la norme C (ISO / IEC 9899: 1999 (E))

7.21.2.3 La fonction strcpy

La description

2 La fonction strncpy ne copie pas plus de n caractères (les caractères qui suivent un caractère nul ne sont pas copiés) du tableau pointé par s2 vers le tableau pointé par s1.260) Si la copie a lieu entre des objects qui se chevauchent, le comportement est indéfini.
3 Si le tableau pointé par s2 est une chaîne plus courte que n caractères, des caractères nuls sont ajoutés à la copie dans le tableau pointé par s1, jusqu’à ce que n caractères aient été écrits.
Résultats
4 La fonction strncpy renvoie la valeur de s1.

7.21.2.1 La fonction memcpy
La description

2 La fonction memcpy copie n caractères de l’object pointé par s2 dans l’object pointé par s1. Si la copie a lieu entre des objects qui se chevauchent, le comportement n’est pas défini.
Retourne 3 La fonction memcpy renvoie la valeur de s1.

Lors de l’utilisation de memcpy() les tampons source et memcpy() peuvent se chevaucher, alors que dans strncpy() cela ne doit pas se produire.

Selon la norme C, le comportement des tampons superposés n’est pas défini pour strncpy() et memcpy() .

Selon le standard C, la différence réelle entre strncpy() et memcpy() est que si la chaîne source est inférieure à N valeur, les caractères NULL sont ajoutés à la quantité N restante.

memcpy() est plus efficace, mais moins sûr, car il ne vérifie pas la source pour voir si elle a une quantité de N à déplacer dans le tampon cible.

Non, strncpy() n’est pas une spécialisation, car il détectera un caractère '\0' lors de la copie et s’arrêtera, quelque chose que memcpy() ne fera pas.

Ajoutant à ce que les autres ont dit, le type des pointeurs src et dst n’a pas d’importance. Autrement dit, je peux copier un entier de 4 octets dans 4 caractères consécutifs de 1 octet comme ceci:

 int num = 5; char arr[4]; memcpy(arr, &num, 4); 

Une autre différence est que memcpy ne ressemble à aucun caractère (comme NULL, par strncpy). Il copie aveuglément un nombre d’octets de la source à la destination.

Edité: correctement formaté le code

Vous pourriez potentiellement rendre strncpy plus rapide en recherchant un \ 0 et en ne copiant pas au-delà de ce point. Ainsi, memcpy copierait toujours toutes les données, mais strncpy serait souvent plus rapide en raison de la vérification.