Namespaces
Variants

wcsrtombs, wcsrtombs_s

From cppreference.net
Definiert in Header <wchar.h>
(1)
size_t wcsrtombs ( char * dst, const wchar_t ** src, size_t len, mbstate_t * ps ) ;
(seit C95)
(bis C99)
size_t wcsrtombs ( char * restrict dst, const wchar_t ** restrict src, size_t len,
mbstate_t * restrict ps ) ;
(seit C99)
errno_t wcsrtombs_s ( size_t * restrict retval, char * restrict dst, rsize_t dstsz,

const wchar_t ** restrict src, rsize_t len,

mbstate_t * restrict ps ) ;
(2) (seit C11)
1) Konvertiert eine Sequenz von Breitzeichen aus dem Array, dessen erstes Element durch * src gezeigt wird, in ihre schmale Multibyte-Darstellung, die im durch * ps beschriebenen Konvertierungszustand beginnt. Falls dst nicht null ist, werden konvertierte Zeichen in den aufeinanderfolgenden Elementen des char-Arrays gespeichert, auf das durch dst gezeigt wird. Es werden nicht mehr als len Bytes in das Zielarray geschrieben. Jedes Zeichen wird konvertiert, als ob durch einen Aufruf von wcrtomb . Die Konvertierung stoppt, wenn:
  • Das Nullzeichen L ' \0 ' konvertiert und gespeichert wurde. Die in diesem Fall gespeicherten Bytes sind die Unshift-Sequenz (falls notwendig) gefolgt von ' \0 ' , * src wird auf den Nullzeigerwert gesetzt und * ps repräsentiert den initialen Shift-Zustand.
  • Ein wchar_t gefunden wurde, der keinem gültigen Zeichen im aktuellen C-Locale entspricht. * src wird so gesetzt, dass es auf das erste nicht konvertierte Breitzeichen zeigt.
  • das nächste zu speichernde Multibyte-Zeichen len überschreiten würde. * src wird so gesetzt, dass es auf das erste nicht konvertierte Breitzeichen zeigt. Diese Bedingung wird nicht überprüft, wenn dst ein Nullzeiger ist.
2) Gleich wie (1) , außer dass
  • die Funktion ihr Ergebnis als Out-Parameter retval zurückgibt
  • falls die Konvertierung ohne Schreiben eines Nullzeichens stoppt, speichert die Funktion ' \0 ' im nächsten Byte in dst , was entweder dst [ len ] oder dst [ dstsz ] sein kann, je nachdem was zuerst kommt (was bedeutet, dass bis zu len+1/dstsz+1 Bytes insgesamt geschrieben werden können). In diesem Fall wird möglicherweise keine Unshift-Sequenz vor dem abschließenden Nullzeichen geschrieben.
  • die Funktion überschreibt das Zielarray ab dem abschließenden Nullzeichen bis dstsz
  • Falls src und dst sich überlappen, ist das Verhalten undefiniert.
  • die folgenden Fehler werden zur Laufzeit erkannt und rufen die aktuell installierte Constraint-Handler-Funktion auf:
  • retval , ps , src oder * src ist ein Nullzeiger
  • dstsz oder len ist größer als RSIZE_MAX (sofern dst nicht null ist)
  • dstsz ist nicht null (sofern dst nicht null ist)
  • len ist größer als dstsz und die Konvertierung trifft vor Erreichen von dstsz weder auf Null noch auf einen Encodierungsfehler im src -Array (sofern dst nicht null ist)
Wie bei allen bounds-checked-Funktionen ist wcsrtombs_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf den Integer-Konstantenwert 1 setzt, bevor <wchar.h> eingebunden wird.

Inhaltsverzeichnis

Parameter

dst - Zeiger auf ein schmales Zeichenarray, in dem die Multibyte-Zeichen gespeichert werden
src - Zeiger auf einen Zeiger zum ersten Element eines nullterminierten Breitzeichen-Strings
len - Anzahl der im Array verfügbaren Bytes, auf das dst zeigt
ps - Zeiger auf das Konvertierungszustandsobjekt
dstsz - Maximale Anzahl der zu schreibenden Bytes (Größe des dst Arrays)
retval - Zeiger auf ein size_t Objekt, in dem das Ergebnis gespeichert wird

Rückgabewert

1) Bei Erfolg gibt die Anzahl der Bytes (einschließlich aller Shift-Sequenzen, aber ausschließlich des abschließenden ' \0 ' ) zurück, die in das Zeichenarray geschrieben wurden, dessen erstes Element durch dst gezeigt wird. Falls dst ein Nullzeiger ist, gibt die Anzahl der Bytes zurück, die geschrieben worden wären. Bei Konvertierungsfehler (falls ein ungültiges Breitzeichen angetroffen wurde) wird ( size_t ) - 1 zurückgegeben, EILSEQ in errno gespeichert und * ps in einem nicht spezifizierten Zustand belassen.
2) Gibt bei Erfolg Null zurück (wobei die Anzahl der Bytes exklusive des abschließenden Nullzeichens, die in dst geschrieben wurden oder geschrieben worden wären, in * retval gespeichert wird), bei Fehler einen Wert ungleich Null. Im Falle einer Laufzeitbedingungsverletzung wird ( size_t ) - 1 in * retval gespeichert (sofern retval nicht null ist) und dst [ 0 ] auf ' \0 ' gesetzt (sofern dst nicht null ist oder dstmax nicht null oder größer als RSIZE_MAX ist).

Beispiel

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
void print_wide(const wchar_t* wstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    size_t len = 1 + wcsrtombs(NULL, &wstr, 0, &state);
    char mbstr[len];
    wcsrtombs(mbstr, &wstr, len, &state);
    printf("Multibyte string: %s\n", mbstr);
    printf("Length, including '\\0': %zu\n", len);
}
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    print_wide(L"z\u00df\u6c34\U0001f34c"); // or L"zß水🍌"
}

Ausgabe:

Multibyte string: zß水🍌
Length, including '\0': 11

Referenzen

  • C17-Standard (ISO/IEC 9899:2018):
  • 7.29.6.4.2 Die wcsrtombs-Funktion (S: 324-325)
  • K.3.9.3.2.2 Die wcsrtombs_s-Funktion (S: 471-472)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.29.6.4.2 Die wcsrtombs-Funktion (S: 446)
  • K.3.9.3.2.2 Die wcsrtombs_s-Funktion (S: 649-651)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.24.6.4.2 Die wcsrtombs-Funktion (S. 392)

Siehe auch

wandelt eine Breitzeichen-Zeichenkette in eine schmale Multibyte-Zeichenkette um
(Funktion)
wandelt ein Breitzeichen in seine Multibyte-Darstellung um, mit Zustandsinformation
(Funktion)
wandelt eine schmale Multibyte-Zeichenkette in eine Breitzeichen-Zeichenkette um, mit Zustandsinformation
(Funktion)
C++-Dokumentation für wcsrtombs