Spec-Zone.ru › C

wcsrtombs, wcsrtombs_s

Определено в заголовке <wchar.h>
(1)
size_t wcsrtombs( char *dst, const wchar_t **src, size_t len, mbstate_t* ps );
(с C95)
(до C99)
size_t wcsrtombs( char *restrict dst, const wchar_t **restrict src, size_t len,
                  mbstate_t *restrict ps );
(с 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) (с C11)
1) Преобразует последовательность широких символов из массива, адрес первого элемента которого указан в *src, в его многобайтовое узкое представление, начиная с состояния преобразования, описанного в *ps. Если dst не равно нулю, преобразованные символы хранятся в последовательных элементах массива символов char, на который указывает dst. В массив назначения записывается не более len байтов. Каждый символ преобразуется так, как будто вызывается wcrtomb. Преобразование останавливается, если:
  • был преобразован и сохранён нулевой символ L'\0'. Записанные в этом случае байты представляют собой последовательность сброса (если необходимо) и за ней следует '\0', *src устанавливается в значение нулевого указателя, а *ps представляет собой начальное состояние сдвига.
  • был найден wchar_t, который не соответствует допустимому символу в текущем локали C. *src устанавливается в указатель на первый не преобразованный широкий символ.
  • следующий многобайтовый символ для записи превысил бы len. *src устанавливается в указатель на первый не преобразованный широкий символ. Это условие не проверяется, если dst является нулевым указателем.
2) Аналогично (1), за исключением того, что
  • функция возвращает свой результат как параметр вывода retval
  • если преобразование останавливается без записи нулевого символа, функция запишет '\0' в следующий байт в dst, что может быть dst[len] или dst[dstsz], в зависимости от того, что появится первым (что означает, что в общей сложности может быть записано до len+1/dstsz+1 байтов). В этом случае может не быть записано никакой последовательности сброса перед завершающим нулём.
  • функция очищает массив назначения от завершающего нуля и до dstsz
  • Если src и dst перекрываются, поведение не определено.
  • следующие ошибки обнаруживаются во время выполнения и вызывают установленную в настоящее время функцию обработчика ограничений обработчик ограничений:
  • retval, ps, src, или *src является нулевым указателем
  • dstsz или len больше, чем RSIZE_MAX (если dst не равен нулю)
  • dstsz не равно нулю (если dst не равен нулю)
  • len больше, чем dstsz и преобразование не встречает нуль или ошибку кодирования в массиве src к моменту, когда достигается dstsz (если dst не равен нулю)
Как и во всех функциях с проверкой границ, wcsrtombs_s гарантировано доступна только если __STDC_LIB_EXT1__ определено реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целую константу 1 перед включением <wchar.h>.

Параметры

dst - указатель на массив узких символов, куда будут записаны многобайтовые символы
src - указатель на указатель на первый элемент нуль-терминированной широкой строки
len - количество байтов, доступных в массиве, на который указывает dst
ps - указатель на объект состояния преобразования
dstsz - максимальное количество байтов, которые будут записаны (размер массива dst)
retval - указатель на объект size_t, куда будет записан результат

Возвращаемое значение

1) При успехе возвращает количество байтов (включая любые последовательности сдвига, но исключая завершающий '\0'), записанных в массив символов, адрес первого элемента которого указан в dst. Если dst является нулевым указателем, возвращает количество байтов, которые были бы записаны. При ошибке преобразования (если был встречен недопустимый широкий символ) возвращает (size_t)-1, записывает EILSEQ в errno и оставляет *ps в неопределённом состоянии.
2) Возвращает ноль при успехе (в этом случае количество байтов, исключая завершающий ноль, которое было или будет записано в dst, сохраняется в *retval), ненулевое значение при ошибке. В случае нарушения ограничения во время выполнения записывает (size_t)-1 в *retval (если retval не равен нулю) и устанавливает dst[0] в '\0' (если dst не равен нулю или dstmax равно нулю или больше RSIZE_MAX).

Пример

#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ß水🍌"
}

Вывод:

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

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.29.6.4.2 Функция wcsrtombs (с. 324-325)
    • K.3.9.3.2.2 Функция wcsrtombs_s (с. 471-472)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.29.6.4.2 Функция wcsrtombs (с. 446)
    • K.3.9.3.2.2 Функция wcsrtombs_s (с. 649-651)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.24.6.4.2 Функция wcsrtombs (с. 392)

См. также

wcstombswcstombs_s
(C11)
преобразует широкую строку в узкую многобайтовую строку символов
(функция)
wcrtombwcrtomb_s
(C95)(C11)
преобразует широкий символ в его многобайтовое представление, учитывая состояние
(функция)
mbsrtowcsmbsrtowcs_s
(C95)(C11)
преобразует узкую многобайтовую строку символов в широкую строку, учитывая состояние
(функция)
Документация C++ для wcsrtombs

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/multibyte/wcsrtombs

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API