strcat, strcat_s
Depuis fr.cppreference.net
| Défini dans l'en-tête <string.h>
|
||
char* strcat( char* dest, const char* src );
|
(1) | (jusqu'à C99) |
char* strcat( char* restrict dest, const char* restrict src );
|
(depuis C99) | |
errno_t strcat_s(char* restrict dest, rsize_t destsz, const char* restrict src);
|
(2) | (depuis C11) |
1) Ajoute une copie de la chaîne d'octets terminée par un caractère nul pointée par
src à la fin de la chaîne d'octets terminée par un caractère nul pointée par dest. Le caractère src[0] remplace le terminateur nul à la fin de dest. La chaîne d'octets résultante est terminée par un caractère nul. Le comportement est indéfini si le tableau de destination n'est pas assez grand pour contenir à la fois le contenu de
src et dest et le caractère nul de terminaison. Le comportement est indéfini si les chaînes se chevauchent. Le comportement est indéfini si dest ou src n'est pas un pointeur vers une chaîne d'octets terminée par un caractère nul.2) Identique à (1), sauf qu'elle peut altérer le reste du tableau de destination (du dernier caractère écrit jusqu'à
destsz) avec des valeurs non spécifiées et que les erreurs suivantes sont détectées à l'exécution et appellent la fonction de gestionnaire de contrainte actuellement installée :
srcoudestest un pointeur nuldestszest nul ou supérieur à RSIZE_MAX- il n'y a pas de terminateur nul dans les premiers
destszoctets dedest - une troncature se produirait (l'espace disponible à la fin de
destne pourrait pas contenir tous les caractères, y compris le terminateur nul, desrc) - un chevauchement se produirait entre la chaîne source et la chaîne de destination
Le comportement est indéfini si la taille du tableau de caractères pointé par
dest < strlen(dest)+strlen(src)+1 <= 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 avec vérification des limites,
strcat_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>.Paramètres
| dest | - | pointeur vers la chaîne d'octets terminée par un caractère nul à laquelle ajouter |
| src | - | pointeur vers la chaîne d'octets terminée par un caractère nul à 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 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 que destsz est nul ou supérieur à RSIZE_MAX).Notes
Parce que strcat doit chercher la fin de dest à chaque appel, il est inefficace de concaténer plusieurs chaînes en une seule en utilisant strcat.
strcat_s est autorisée à altérer le tableau de destination du dernier caractère écrit jusqu'à destsz afin d'améliorer l'efficacité : elle peut copier par blocs multi-octets puis vérifier les octets nuls.
La fonction strcat_s est similaire à la fonction BSD strlcat, sauf que
strlcattronque la chaîne source pour qu'elle tienne dans la destinationstrlcatn'effectue pas toutes les vérifications à l'exécution questrcat_sfaitstrlcatne 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 strcat_s interdise la troncature en raison des risques potentiels de sécurité, il est possible de tronquer une chaîne en utilisant strncat avec vérification des limites à la place.
Exemple
Exécuter ce code
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char str[50] = "Hello ";
char str2[50] = "World!";
strcat(str, str2);
strcat(str, " ...");
strcat(str, " Goodbye World!");
puts(str);
#ifdef __STDC_LIB_EXT1__
set_constraint_handler_s(ignore_handler_s);
int r = strcat_s(str, sizeof str, " ... ");
printf("str = \"%s\", r = %d\n", str, r);
r = strcat_s(str, sizeof str, " and this is too much");
printf("str = \"%s\", r = %d\n", str, r);
#endif
}
Sortie possible :
Hello World! ... Goodbye World!
str = "Hello World! ... Goodbye World! ... ", r = 0
str = "", r = 22
Références
- Norme C23 (ISO/IEC 9899:2024) :
- 7.24.3.1 La fonction strcat (p: TBD)
- K.3.7.2.1 La fonction strcat_s (p: TBD)
- Norme C17 (ISO/IEC 9899:2018) :
- 7.24.3.1 La fonction strcat (p: TBD)
- K.3.7.2.1 La fonction strcat_s (p: TBD)
- Norme C11 (ISO/IEC 9899:2011) :
- 7.24.3.1 La fonction strcat (p: 364)
- K.3.7.2.1 La fonction strcat_s (p: 617-618)
- Norme C99 (ISO/IEC 9899:1999) :
- 7.21.3.1 La fonction strcat (p: 327)
- Norme C89/C90 (ISO/IEC 9899:1990) :
- 4.11.3.1 La fonction strcat
Voir aussi
(C11) |
concatène un certain nombre de caractères de deux chaînes (fonction) |
(C11) |
copie une chaîne vers une autre (fonction) |
(C23) |
copie un tampon vers un autre, en s'arrêtant après le délimiteur spécifié (fonction) |
Documentation C++ pour strcat
| |