Namespaces
Variants

strncat, strncat_s

From cppreference.net
< c ‎ | string ‎ | byte
Défini dans l'en-tête <string.h>
(1)
char * strncat ( char * dest, const char * src, size_t count ) ;
(jusqu'à C99)
char * strncat ( char * restrict dest, const char * restrict src, size_t count ) ;
(depuis C99)
errno_t strncat_s ( char * restrict dest, rsize_t destsz,
const char * restrict src, rsize_t count ) ;
(2) (depuis C11)
1) Ajoute au maximum count caractères du tableau de caractères pointé par src , en s'arrêtant si le caractère nul est trouvé, à la fin de la chaîne d'octets terminée par un nul pointée par dest . Le caractère src [ 0 ] remplace le terminateur nul à la fin de dest . Le caractère nul de fin est toujours ajouté à la fin (donc le nombre maximum d'octets que la fonction peut écrire est count + 1 ).
Le comportement est indéfini si le tableau de destination n'a pas assez d'espace pour le contenu de dest et des premiers count caractères de src , plus le caractère nul de fin. Le comportement est indéfini si les objets source et destination se chevauchent. Le comportement est indéfini si dest n'est pas un pointeur vers une chaîne d'octets terminée par un caractère nul ou si src n'est pas un pointeur vers un tableau de caractères.
2) Identique à (1) , sauf que cette fonction peut altérer le reste du tableau de destination (à partir du dernier octet écrit jusqu'à destsz ) et que les erreurs suivantes sont détectées à l'exécution et appellent la fonction constraint handler actuellement installée :
  • src ou dest est un pointeur nul
  • destsz ou count est zéro ou supérieur à RSIZE_MAX
  • il n'y a pas de caractère nul dans les premiers destsz octets de dest
  • une troncation se produirait : count ou la longueur de src , selon la plus petite, dépasse l'espace disponible entre le terminateur nul de dest et destsz .
  • 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 ( dest,destsz ) + strnlen ( src,count ) + 1 < destsz ; en d'autres termes, une valeur erronée de destsz n'expose pas le dépassement de tampon imminent. Le comportement est indéfini si la taille du tableau de caractères pointé par src < strnlen ( src,count ) < destsz ; en d'autres termes, une valeur erronée de count n'expose pas le dépassement de tampon imminent.
Comme pour toutes les fonctions à vérification de limites, strncat_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 la chaîne d'octets terminée par un caractère nul à laquelle ajouter
src - pointeur vers le tableau de caractères à partir duquel copier
count - nombre maximum de caractères à copier
destsz - taille du tampon de destination

Valeur de retour

1) renvoie une copie de dest
2) 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 destsz est zéro ou supérieur à RSIZE_MAX ).

Notes

Parce que strncat doit chercher la fin de dest à chaque appel, il est inefficace de concaténer plusieurs chaînes en une seule en utilisant strncat .

Bien que la troncation pour ajuster le tampon de destination soit un risque de sécurité et donc une violation des contraintes d'exécution pour strncat_s , il est possible d'obtenir le comportement de troncation en spécifiant count égal à la taille du tableau de destination moins un : cela copiera les premiers count octets et ajoutera le terminateur nul comme toujours : strncat_s ( dst, sizeof dst, src, ( sizeof dst ) - strnlen_s ( dst, sizeof dst ) - 1 ) ;

Exemple

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char str[50] = "Hello ";
    char str2[50] = "World!";
    strcat(str, str2);
    strncat(str, " Goodbye World!", 3);
    puts(str);
#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    char s1[100] = "good";
    char s5[1000] = "bye";
    int r1 = strncat_s(s1, 100, s5, 1000); // r1 est 0, s1 contient "goodbye\0"
    printf("s1 = %s, r1 = %d\n", s1, r1);
    char s2[6] = "hello";
    int r2 = strncat_s(s2, 6, "", 1); // r2 est 0, s2 contient "hello\0"
    printf("s2 = %s, r2 = %d\n", s2, r2);
    char s3[6] = "hello";
    int r3 = strncat_s(s3, 6, "X", 2); // r3 est non nul, s3 contient "\0"
    printf("s3 = %s, r3 = %d\n", s3, r3);
    // l'idiome de troncation strncat_s :
    char s4[7] = "abc";
    int r4 = strncat_s(s4, 7, "defghijklmn", 3); // r4 est 0, s4 contient "abcdef\0"
    printf("s4 = %s, r4 = %d\n", s4, r4);
#endif
}

Sortie possible :

Hello World! Go
s1 = goodbye, r1 = 0
s2 = hello, r2 = 0
s3 = , r3 = 22
s4 = abcdef, r4 = 0

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.26.3.2 La fonction strncat (p: 379)
  • K.3.7.2.2 La fonction strncat_s (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.24.3.2 La fonction strncat (p : 265-266)
  • K.3.7.2.2 La fonction strncat_s (p : 449-450)
  • Norme C11 (ISO/CEI 9899:2011):
  • 7.24.3.2 La fonction strncat (p: 364-365)
  • K.3.7.2.2 La fonction strncat_s (p: 618-620)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.21.3.2 La fonction strncat (p: 327-328)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.11.3.2 La fonction strncat

Voir aussi

concatène deux chaînes de caractères
(fonction)
copie une chaîne de caractères 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 strncat