strcpy, strcpy_s
De fr.cppreference.net
| Défini dans l'en-tête <string.h>
|
||
char* strcpy( char* dest, const char* src );
|
(1) | (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 d'octets terminée par null pointée par
src, y compris le terminateur null, vers le tableau de caractères dont le premier élément est pointé par dest. Le comportement est indéfini si le tableau
dest n'est pas assez grand. Le comportement est indéfini si les chaînes se chevauchent. Le comportement est indéfini si dest n'est pas un pointeur vers un tableau de caractères ou si src n'est pas un pointeur vers une chaîne d'octets terminée par null.2) Identique à (1), sauf qu'elle peut écraser 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 contrainte actuellement installée :
srcoudestest un pointeur nuldestszest zéro ou supérieur àRSIZE_MAXdestszest inférieur ou égal àstrnlen_s(src, destsz); en d'autres termes, une troncature 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 n'expose pas le débordement de tampon imminent. Comme pour toutes les fonctions vérifiées aux limites,
strcpy_s n'est garanti 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__ comme la constante entière 1 avant d'inclure <string.h>.Paramètres
| dest | - | pointeur vers le tableau de caractères dans lequel écrire |
| src | - | pointeur vers la chaîne d'octets terminée par null à copier |
| destsz | - | nombre maximal de caractères à écrire, généralement la taille du tampon de destination |
Valeur de retour
1) retourne une copie de
dest2) retourne zéro en cas de succès, retourne non nul 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ée à écraser le tableau de destination depuis le dernier caractère écrit jusqu'à destsz afin d'améliorer l'efficacité : elle peut copier par blocs multi-octets puis rechercher les octets nuls.
La fonction strcpy_s est similaire à la fonction BSD strlcpy, sauf que
strlcpytronque la chaîne source pour l'adapter à la destination (ce qui est un risque de sécurité)strlcpyn'effectue pas toutes les vérifications à l'exécution questrcpy_seffectuestrlcpyne 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 troncature en raison des risques potentiels de sécurité, il est possible de tronquer une chaîne en utilisant plutôt strncpy vérifié aux limites.
Exemple
Exécuter ce code
#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' ; // this would be undefined behavior
char dst[strlen(src) + 1]; // +1 to accommodate for the null terminator
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/IEC 9899:2018) :
- 7.24.2.3 La fonction strcpy (p : 264-265)
- K.3.7.1.3 La fonction strcpy_s (p : 447)
- Norme C11 (ISO/IEC 9899:2011) :
- 7.24.2.3 La fonction strcpy (p : 363)
- K.3.7.1.3 La fonction strcpy_s (p : 615-616)
- Norme C99 (ISO/IEC 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) |
allouer une copie d'une chaîne (fonction) |
Documentation C++ pour strcpy
| |