mbsrtowcs, mbsrtowcs_s
From cppreference.net
|
Definiert in Header
<wchar.h>
|
||
| (1) | ||
|
(seit C95)
(bis C99) |
||
| (seit C99) | ||
| (2) | (seit C11) | |
1)
Konvertiert eine nullterminierte Multibyte-Zeichenfolge, die im durch
*ps
beschriebenen Konvertierungszustand beginnt, aus dem Array, dessen erstes Element durch
*
src
gezeigt wird, in ihre Wide-Character-Darstellung. Falls
dst
nicht null ist, werden konvertierte Zeichen in den aufeinanderfolgenden Elementen des durch
dst
gezeigten wchar_t-Arrays gespeichert. Es werden nicht mehr als
len
Wide Characters in das Zielarray geschrieben. Jedes Multibyte-Zeichen wird konvertiert, als ob durch einen Aufruf von
mbrtowc
. Die Konvertierung stoppt, wenn:
-
Das Multibyte-Nullzeichen konvertiert und gespeichert wurde.
*
src
wird auf den Nullzeigerwert gesetzt und
*psrepräsentiert den initialen Shift-Zustand. - Ein ungültiges Multibyte-Zeichen (gemäß der aktuellen C-Locale) angetroffen wurde. * src wird auf den Anfang des ersten nicht konvertierten Multibyte-Zeichens gesetzt.
-
Das nächste zu speichernde Wide Character
lenüberschreiten würde. * src wird auf den Anfang des ersten nicht konvertierten Multibyte-Zeichens gesetzt. Diese Bedingung wird nicht geprüft, wenndstein Nullzeiger ist.
2)
Gleich wie
(1)
, außer dass
-
die Funktion ihr Ergebnis als Out-Parameter
retvalzurückgibt -
falls nach dem Schreiben von
lenBreitzeichen kein Nullzeichen indstgeschrieben wurde, dann wird L ' \0 ' indst[len]gespeichert, was bedeutet, dass insgesamt len+1 Breitzeichen geschrieben werden -
die Funktion überschreibt das Zielarray vom abschließenden Nullzeichen bis
dstsz -
Falls
srcunddstsich überlappen, ist das Verhalten nicht spezifiziert. - 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/sizeof(wchar_t) (soferndstnicht null ist) -
dstszist nicht null (soferndstnicht null ist) -
Es gibt kein Nullzeichen in den ersten
dstszMultibyte-Zeichen im * src -Array undlenist größer alsdstsz(soferndstnicht null ist)
-
-
Wie bei allen grenzprüfenden Funktionen ist
mbsrtowcs_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 das Breitzeichen-Array, in dem die Ergebnisse gespeichert werden |
| src | - | Zeiger auf den Zeiger zum ersten Element eines nullterminierten Multibyte-Strings |
| len | - | Anzahl der im Array verfügbaren Breitzeichen, auf das dst zeigt |
| ps | - | Zeiger auf das Konvertierungszustandsobjekt |
| dstsz | - |
Maximale Anzahl der zu schreibenden Breitzeichen (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 Breitzeichen zurück, ausgenommen des abschließenden
L
'
\0
'
, die in das Zeichenarray geschrieben wurden. Falls
dst
ein Nullzeiger ist, gibt die Anzahl der Breitzeichen zurück, die bei unbegrenzter Länge geschrieben worden wären. Bei Konvertierungsfehler (falls ein ungültiges Multibyte-Zeichen angetroffen wurde), gibt
(
size_t
)
-
1
zurück, speichert
EILSEQ
in
errno
und belässt
*
ps
in einem nicht spezifizierten Zustand.
2)
Null bei Erfolg (wobei die Anzahl der Breitzeichen ohne abschließende Null, die in
dst
geschrieben wurden oder geschrieben worden wären, in
*
retval
gespeichert wird), Nicht-Null bei Fehler. Im Falle einer Runtime Constraint Violation wird
(
size_t
)
-
1
in
*
retval
gespeichert (sofern
retval
nicht null ist) und
dst
[
0
]
auf
L
'
\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 <wchar.h> #include <string.h> void print_as_wide(const char* mbstr) { mbstate_t state; memset(&state, 0, sizeof state); size_t len = 1 + mbsrtowcs(NULL, &mbstr, 0, &state); wchar_t wstr[len]; mbsrtowcs(&wstr[0], &mbstr, len, &state); wprintf(L"Wide string: %ls \n", wstr); wprintf(L"The length, including L'\\0': %zu\n", len); } int main(void) { setlocale(LC_ALL, "en_US.utf8"); print_as_wide(u8"z\u00df\u6c34\U0001f34c"); // u8"zß水🍌" }
Ausgabe:
Wide string: zß水🍌 The length, including L'\0': 5
Referenzen
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.29.6.4.1 Die mbsrtowcs-Funktion (S. 445)
-
- K.3.9.3.2.1 Die mbsrtowcs_s-Funktion (S. 648-649)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.24.6.4.1 Die mbsrtowcs-Funktion (S. 391)
Siehe auch
|
(C11)
|
Konvertiert eine Multibyte-Zeichenkette in eine Breitzeichen-Zeichenkette
(Funktion) |
|
(C95)
|
Konvertiert das nächste Multibyte-Zeichen in ein Breitzeichen mit Zustand
(Funktion) |
|
(C95)
(C11)
|
Konvertiert eine Breitzeichen-Zeichenkette in eine Multibyte-Zeichenkette mit Zustand
(Funktion) |
|
C++-Dokumentation
für
mbsrtowcs
|
|