strcpy, strcpy_s
|
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) |
-
- 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
-
Comme pour toutes les fonctions à vérification de limites,
strcpy_sn'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
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
-
strlcpytronque la chaîne source pour qu'elle tienne dans la destination (ce qui représente un risque de sécurité) -
strlcpyn'effectue pas toutes les vérifications à l'exécution questrcpy_sréalise -
strlcpyne 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
|
(C11)
|
copie un certain nombre de caractères d'une chaîne à une autre
(fonction) |
|
(C11)
|
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) |
|
Documentation C++
pour
strcpy
|
|