wcsrtombs, wcsrtombs_s
From cppreference.net
|
Definiert in Header
<wchar.h>
|
||
| (1) | ||
|
(seit C95)
(bis C99) |
||
| (seit C99) | ||
| (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, wenndstein Nullzeiger ist.
2)
Gleich wie
(1)
, außer dass
-
die Funktion ihr Ergebnis als Out-Parameter
retvalzurü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
srcunddstsich überlappen, ist das Verhalten undefiniert. - die folgenden Fehler werden zur Laufzeit erkannt und rufen die aktuell installierte Constraint-Handler-Funktion auf:
-
-
retval,ps,srcoder * src ist ein Nullzeiger -
dstszoderlenist größer als RSIZE_MAX (soferndstnicht null ist) -
dstszist nicht null (soferndstnicht null ist) -
lenist größer alsdstszund die Konvertierung trifft vor Erreichen vondstszweder auf Null noch auf einen Encodierungsfehler imsrc-Array (soferndstnicht null ist)
-
-
Wie bei allen bounds-checked-Funktionen ist
wcsrtombs_snur 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
Diesen Code ausführen
#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
|
(C11)
|
wandelt eine Breitzeichen-Zeichenkette in eine schmale Multibyte-Zeichenkette um
(Funktion) |
|
(C95)
(C11)
|
wandelt ein Breitzeichen in seine Multibyte-Darstellung um, mit Zustandsinformation
(Funktion) |
|
(C95)
(C11)
|
wandelt eine schmale Multibyte-Zeichenkette in eine Breitzeichen-Zeichenkette um, mit Zustandsinformation
(Funktion) |
|
C++-Dokumentation
für
wcsrtombs
|
|