Namespaces
Variants

wcsncpy, wcsncpy_s

Aus de.cppreference.net
< c | string | wide
 
 
 
 
Definiert in der Header-Datei <wchar.h>
wchar_t* wcsncpy( wchar_t* dest, const wchar_t* src, size_t count );
(1) (seit C95)
(bis C99)
wchar_t* wcsncpy( wchar_t* restrict dest, const wchar_t* restrict src, size_t count );
(seit C99)
errno_t wcsncpy_s( wchar_t* restrict dest, rsize_t destsz,
                   const wchar_t* restrict src, rsize_t count);
(2) (seit C11)
1) Kopiert höchstens count Zeichen der Wide-String, auf die src zeigt (einschließlich des terminierenden Null-Wide-Zeichens), in das Wide-Zeichen-Array, auf das dest zeigt.
Wenn count erreicht wird, bevor der gesamte String src kopiert wurde, wird das resultierende Wide-Zeichen-Array nicht null-terminiert.
Wenn nach dem Kopieren des terminierenden Null-Wide-Zeichens aus src count nicht erreicht wird, werden zusätzliche Null-Wide-Zeichen in dest geschrieben, bis insgesamt count Zeichen geschrieben wurden.
Wenn sich die Strings überschneiden, ist das Verhalten undefiniert.
2) Gleich wie (1), außer dass die Funktion keine Nullen in das Ziel-Array schreibt, um bis count aufzufüllen; sie stoppt nach dem Schreiben des terminierenden Null-Zeichens (falls es keine Null in der Quelle gab, schreibt sie eine an dest[count] und stoppt dann). Zusätzlich werden die folgenden Fehler zur Laufzeit erkannt, und die aktuell installierte Constraint-Handler-Funktion wird aufgerufen:
  • src oder dest ist ein Nullzeiger
  • destsz oder count ist null oder größer als RSIZE_MAX / sizeof(wchar_t)
  • count ist größer oder gleich destsz, aber destsz ist kleiner oder gleich wcsnlen_s(src, count), mit anderen Worten, eine Kürzung würde auftreten
  • eine Überschneidung zwischen Quell- und Ziel-Strings würde auftreten
Wie bei allen bereichsgeprüften Funktionen ist wcsncpy_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und der Benutzer __STDC_WANT_LIB_EXT1__ auf die ganzzahlige Konstante 1 setzt, bevor <wchar.h> eingebunden wird.

Parameter

dest - Zeiger auf das Breitzeichen-Array, in das kopiert werden soll
src - Zeiger auf die zu kopierende Breitzeichen-Zeichenkette
count - maximale Anzahl der zu kopierenden Breitzeichen
destsz - Größe des Zielpuffers

Rückgabewert

1) gibt eine Kopie von dest
zurück2) gibt bei Erfolg Null zurück, bei einem Fehler einen Wert ungleich Null. Im Fehlerfall wird außerdem L'\0' in dest[0] geschrieben (es sei denn, dest ist ein Nullzeiger oder destsz ist Null oder größer als RSIZE_MAX / sizeof(wchar_t)) und der Rest des Zielarrays kann mit nicht näher bezeichneten Werten überschrieben werden.

Anmerkungen

Bei typischer Verwendung ist count die Anzahl der Elemente im Ziel-Array.

Obwohl das Abschneiden, um in den Zielpuffer zu passen, ein Sicherheitsrisiko und daher eine Laufzeiteinschränkungsverletzung für wcsncpy_s darstellt, ist es möglich, das abschneidende Verhalten zu erreichen, indem man count gleich der Größe des Ziel-Arrays minus eins setzt: Es werden die ersten count Breitzeichen kopiert und wie immer das abschließende Null-Breitzeichen angehängt:

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

Beispiel

#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 ");
    }
}

Mögliche Ausgabe:

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

Referenzen

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

Siehe auch

(C95) (C11)
kopiert eine Breitzeichen-Zeichenkette in eine andere
(Funktion)
kopiert eine bestimmte Anzahl von Breitzeichen zwischen zwei nicht überlappenden Arrays
(Funktion)
kopiert eine bestimmte Anzahl von Zeichen von einer Zeichenkette in eine andere
(Funktion)
C++-Dokumentation für wcsncpy