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 :
srcoudestest un pointeur nuldestszoucountest zéro ou supérieur àRSIZE_MAX / sizeof(wchar_t)countest supérieur ou égal àdestsz, maisdestszest 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_sn'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ère1avant 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
dest2) 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
Exécuter ce code
#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) |
(C95)(C11) |
copie un certain nombre de caractères larges entre deux tableaux non chevauchants (fonction) |
(C11) |
copie un certain nombre de caractères d'une chaîne à une autre (fonction) |
Documentation C++ pour wcsncpy
| |