Namespaces
Variants

wcsncpy, wcsncpy_s

Depuis fr.cppreference.net
 
 
 
 
Défini dans l'en-tête <wchar.h>
wchar_t* wcsncpy( wchar_t* dest, const wchar_t* src, size_t count );
(1) (depuis C95)
(jusqu'à C99)
wchar_t* wcsncpy( wchar_t* restrict dest, const wchar_t* restrict src, size_t count );
(depuis C99)
errno_t wcsncpy_s( wchar_t* restrict dest, rsize_t destsz,
                   const wchar_t* restrict src, rsize_t count);
(2) (depuis C11)
1) Copie au maximum count caractères de la chaîne large pointée par src (y compris le caractère large nul de terminaison) dans le tableau de caractères larges pointé par dest.
Si count est atteint avant que la chaîne entière src n'ait été copiée, le tableau de caractères larges résultant n'est pas terminé par un caractère nul.
Si, après avoir copié le caractère large nul de terminaison de src, count n'est pas atteint, des caractères larges nuls supplémentaires sont écrits dans dest jusqu'à ce qu'un total de count caractères ait été écrit.
Si les chaînes se chevauchent, le comportement est indéfini.
2) Identique à (1), sauf que la fonction ne continue pas à écrire des zéros dans le tableau de destination pour remplir jusqu'à count, elle s'arrête après avoir écrit le caractère nul de terminaison (s'il n'y avait pas de nul dans la source, elle en écrit un à dest[count] puis s'arrête). De plus, les erreurs suivantes sont détectées à l'exécution et appellent la fonction de gestionnaire de contrainte actuellement installée :
  • src ou dest est un pointeur nul
  • destsz ou count est zéro ou supérieur à RSIZE_MAX / sizeof(wchar_t)
  • count est supérieur ou égal à destsz, mais destsz est inférieur ou égal à wcsnlen_s(src, count), en d'autres termes, une troncature se produirait
  • un chevauchement se produirait entre les chaînes source et destination
Comme pour toutes les fonctions vérifiées aux limites, wcsncpy_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__ à la constante entière 1 avant d'inclure <wchar.h>.

Paramètres

dest - pointeur vers le tableau de caractères larges dans lequel copier
src - pointeur vers la chaîne large à copier
count - nombre maximal de caractères larges à copier
destsz - la taille du tampon de destination

Valeur de retour

1) retourne une copie de dest
2) retourne zéro en cas de succès, retourne non nul en cas d'erreur. Aussi, en cas d'erreur, écrit L'\0' dans dest[0] (sauf si dest est un pointeur nul ou destsz est zéro ou supérieur à RSIZE_MAX / sizeof(wchar_t)) et peut écraser le reste du tableau de destination avec des valeurs non spécifiées.

Notes

En utilisation typique, count est le nombre d'éléments dans le tableau de destination.

Bien que la troncature pour adapter le tampon de destination soit un risque de sécurité et donc une violation de contrainte d'exécution pour wcsncpy_s, il est possible d'obtenir un comportement de troncature en spécifiant count égal à la taille du tableau de destination moins un : il copiera les count premiers caractères larges et ajoutera le terminateur large nul comme toujours :

size_t count = sizeof dst / sizeof *dst;
wcsncpy_s(dst, count, src, count - 1);

Exemple

#include <locale.h>
#include <stdio.h>
#include <wchar.h>
 
int main(void)
{
    const wchar_t src[] = L"わゐ";
    wchar_t dest[6] = {L'あ', L'い', L'う', L'え', L'お'};
 
    wcsncpy(dest, src, 4); // this will copy わゐ and repeat L'\0' two times
 
    puts("The contents of dest are: ");
    setlocale(LC_ALL, "en_US.utf8");

    const long dest_size = sizeof dest / sizeof *dest;
    for(wchar_t* p = dest; p - dest != dest_size; ++p) {
        *p ? printf("%lc ", *p)
           : printf("\\0 ");
    }
}

Sortie possible :

The contents of dest are:
わ ゐ \0 \0 お \0

Références

  • Norme C23 (ISO/IEC 9899:2024) :
  • 7.31.4.2.2 La fonction wcsncpy (p. 438)
  • K.3.9.3.1.2 La fonction wcsncpy_s (p. 663-664)
  • Norme C17 (ISO/IEC 9899:2018) :
  • 7.29.4.2.2 La fonction wcsncpy (p. 314)
  • K.3.9.2.1.2 La fonction wcsncpy_s (p. 464)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.29.4.2.2 La fonction wcsncpy (p. 431)
  • K.3.9.2.1.2 La fonction wcsncpy_s (p. 640-641)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 7.24.4.2.2 La fonction wcsncpy (p. 377)

Voir aussi

(C95)(C11)
copie une chaîne large vers une autre
(fonction)
copie un certain nombre de caractères larges entre deux tableaux non chevauchants
(fonction)
copie un certain nombre de caractères d'une chaîne à une autre
(fonction)
Documentation C++ pour wcsncpy