Namespaces
Variants

mbsrtowcs, mbsrtowcs_s

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

wchar_t * restrict dst, rsize_t dstsz,
const char ** restrict src, rsize_t len,

mbstate_t * restrict ps ) ;
(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 *ps reprä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, wenn dst ein Nullzeiger ist.
2) Gleich wie (1) , außer dass
  • die Funktion ihr Ergebnis als Out-Parameter retval zurückgibt
  • falls nach dem Schreiben von len Breitzeichen kein Nullzeichen in dst geschrieben wurde, dann wird L ' \0 ' in dst[len] gespeichert, was bedeutet, dass insgesamt len+1 Breitzeichen geschrieben werden
  • die Funktion überschreibt das Zielarray vom abschließenden Nullzeichen bis dstsz
  • Falls src und dst sich überlappen, ist das Verhalten nicht spezifiziert.
  • 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/sizeof(wchar_t) (sofern dst nicht null ist)
  • dstsz ist nicht null (sofern dst nicht null ist)
  • Es gibt kein Nullzeichen in den ersten dstsz Multibyte-Zeichen im * src -Array und len ist größer als dstsz (sofern dst nicht null ist)
Wie bei allen grenzprüfenden Funktionen ist mbsrtowcs_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 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

#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

Konvertiert eine Multibyte-Zeichenkette in eine Breitzeichen-Zeichenkette
(Funktion)
(C95)
Konvertiert das nächste Multibyte-Zeichen in ein Breitzeichen mit Zustand
(Funktion)
Konvertiert eine Breitzeichen-Zeichenkette in eine Multibyte-Zeichenkette mit Zustand
(Funktion)
C++-Dokumentation für mbsrtowcs