Namespaces
Variants

strcpy, strcpy_s

From cppreference.net
< c ‎ | string ‎ | byte
Défini dans l'en-tête <string.h>
(1)
char * strcpy ( char * dest, const char * src ) ;
(jusqu'à C99)
char * strcpy ( char * restrict dest, const char * restrict src ) ;
(depuis C99)
errno_t strcpy_s ( char * restrict dest, rsize_t destsz, const char * restrict src ) ;
(2) (depuis C11)
1) Copie la chaîne de caractères terminée par un caractère nul pointée par src , y compris le terminateur nul, vers le tableau de caractères dont le premier élément est pointé par dest .
Le comportement est indéfini si le dest tableau n'est pas suffisamment grand. Le comportement est indéfini si les chaînes se chevauchent. Le comportement est indéfini si soit dest n'est pas un pointeur vers un tableau de caractères, soit src n'est pas un pointeur vers une chaîne d'octets terminée par un caractère nul.
2) Identique à (1) , sauf qu'il peut altérer le reste du tableau de destination avec des valeurs non spécifiées et que les erreurs suivantes sont détectées à l'exécution et appellent la fonction gestionnaire de contraintes actuellement installée :
  • src ou dest est un pointeur nul
  • destsz est zéro ou supérieur à RSIZE_MAX
  • destsz est inférieur ou égal à strnlen_s ( src, destsz ) ; en d'autres termes, une troncation se produirait
  • un chevauchement se produirait entre les chaînes source et destination
Le comportement est indéfini si la taille du tableau de caractères pointé par dest <= strnlen_s ( src, destsz ) < destsz ; en d'autres termes, une valeur erronée de destsz peut permettre un dépassement de tampon.
Comme pour toutes les fonctions à vérification de limites, strcpy_s n'est garantie d'être disponible que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit __STDC_WANT_LIB_EXT1__ à la constante entière 1 avant d'inclure <string.h> .

Table des matières

Paramètres

dest - pointeur vers le tableau de caractères à écrire
src - pointeur vers la chaîne d'octets terminée par un caractère nul à copier
destsz - nombre maximum de caractères à écrire, généralement la taille du tampon de destination

Valeur de retour

1) retourne une copie de dest
2) renvoie zéro en cas de succès, renvoie une valeur non nulle en cas d'erreur. De plus, en cas d'erreur, écrit zéro dans dest [ 0 ] (sauf si dest est un pointeur nul ou destsz est zéro ou supérieur à RSIZE_MAX ).

Notes

strcpy_s est autorisé à écraser le tableau de destination à partir du dernier caractère écrit jusqu'à destsz afin d'améliorer l'efficacité : il peut copier en blocs multioctets puis vérifier les octets nuls.

La fonction strcpy_s est similaire à la fonction BSD strlcpy , sauf que

  • strlcpy tronque la chaîne source pour qu'elle tienne dans la destination (ce qui représente un risque de sécurité)
  • strlcpy n'effectue pas toutes les vérifications à l'exécution que strcpy_s réalise
  • strlcpy ne rend pas les échecs évidents en définissant la destination sur une chaîne nulle ou en appelant un gestionnaire si l'appel échoue.

Bien que strcpy_s interdise la troncation en raison de risques de sécurité potentiels, il est possible de tronquer une chaîne en utilisant la fonction à vérification de limites strncpy_s à la place.

Exemple

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    const char* src = "Take the test.";
//  src[0] = 'M' ; // ceci serait un comportement indéfini
    char dst[strlen(src) + 1]; // +1 pour accommoder le terminateur nul
    strcpy(dst, src);
    dst[0] = 'M'; // OK
    printf("src = %s\ndst = %s\n", src, dst);
#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = strcpy_s(dst, sizeof dst, src);
    printf("dst = \"%s\", r = %d\n", dst, r);
    r = strcpy_s(dst, sizeof dst, "Take even more tests.");
    printf("dst = \"%s\", r = %d\n", dst, r);
#endif
}

Sortie possible :

src = Take the test.
dst = Make the test.
dst = "Take the test.", r = 0
dst = "", r = 22

Références

  • Norme C23 (ISO/IEC 9899:2024):
  • 7.24.2.3 La fonction strcpy (p: TBD)
  • K.3.7.1.3 La fonction strcpy_s (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.24.2.3 Fonction strcpy (p: 264-265)
  • K.3.7.1.3 Fonction strcpy_s (p: 447)
  • Norme C11 (ISO/CEI 9899:2011):
  • 7.24.2.3 Fonction strcpy (p: 363)
  • K.3.7.1.3 Fonction strcpy_s (p: 615-616)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.21.2.3 La fonction strcpy (p. 326)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.11.2.3 La fonction strcpy

Voir aussi

copie un certain nombre de caractères d'une chaîne à une autre
(fonction)
copie un tampon vers un autre
(fonction)
(C95) (C11)
copie une chaîne large vers une autre
(fonction)
(dynamic memory TR)
alloue une copie d'une chaîne
(fonction)