Namespaces
Variants

wcsrtombs, wcsrtombs_s

From cppreference.net
Определено в заголовке <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)

Смотрите также

преобразует широкую строку в узкую многобайтовую строку символов
(функция)
преобразует широкий символ в его многобайтовое представление с учетом состояния
(функция)
преобразует узкую многобайтовую строку символов в широкую строку с учетом состояния
(функция)
C++ documentation для wcsrtombs