wcstombs_s
, _wcstombs_s_l
Преобразует последовательность расширенных символов в соответствующую последовательность многобайтовых символов. Версия с _wcstombs_l
улучшениями безопасности, как описано в функциях wcstombs
безопасности в CRT.
Синтаксис
errno_t wcstombs_s(
size_t *pReturnValue,
char *mbstr,
size_t sizeInBytes,
const wchar_t *wcstr,
size_t count
);
errno_t _wcstombs_s_l(
size_t *pReturnValue,
char *mbstr,
size_t sizeInBytes,
const wchar_t *wcstr,
size_t count,
_locale_t locale
);
template <size_t size>
errno_t wcstombs_s(
size_t *pReturnValue,
char (&mbstr)[size],
const wchar_t *wcstr,
size_t count
); // C++ only
template <size_t size>
errno_t _wcstombs_s_l(
size_t *pReturnValue,
char (&mbstr)[size],
const wchar_t *wcstr,
size_t count,
_locale_t locale
); // C++ only
Параметры
pReturnValue
Размер преобразованной строки в байтах, включая терминатор NULL.
mbstr
Адрес буфера для итоговой преобразованной строки многобайтовых символов.
sizeInBytes
Размер (в байтах) буфера mbstr
.
wcstr
Указывает на строку расширенных символов, которую необходимо преобразовать.
count
Максимальное число байтов для хранения в буфере mbstr
, не включая завершающийся пустой символ или _TRUNCATE
.
locale
Используемый языковой стандарт.
Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи.
Условие ошибки | Возвращаемое значение и errno |
---|---|
mbstr is NULL и sizeInBytes > 0 |
EINVAL |
wcstr имеет значение NULL . |
EINVAL |
Буфер назначения слишком мал, чтобы вместить преобразованную строку (если параметр count не имеет значение _TRUNCATE ; см. примечания ниже). |
ERANGE |
При возникновении любого из этих условий вызывается недопустимое исключение параметров, как описано в разделе "Проверка параметров". Если выполнение может быть продолжено, то функция возвращает код ошибки и устанавливает errno
, как показано в таблице.
Замечания
Функция wcstombs_s
преобразует строку расширенных символов, на которую указывает wcstr
, в многобайтовые символы, сохраненные в буфере, на который указывает mbstr
. Преобразование будет продолжаться для каждого символа до тех пор, пока не будет выполнено одно из указанных ниже условий.
Встретился расширенный нуль-символ.
Обнаружен широкий символ, который не может быть преобразован
Число байтов, сохраненных в буфере
mbstr
, равноcount
.
Строка назначения всегда завершается значением NULL (даже если возникает ошибка).
Если count
это специальное значение _TRUNCATE
, то wcstombs_s
преобразуется столько строки, сколько вместится в целевой буфер, при этом остается место для конца null. Если строка усечена, возвращаемое значение равно STRUNCATE
, и преобразование считается успешным.
При wcstombs_s
успешном преобразовании исходной строки он помещает размер в байты преобразованной строки, включая терминатор NULL, *pReturnValue
в (указан pReturnValue
не NULL
). Размер вычисляется даже в том случае, если mbstr
аргумент имеет NULL
значение; он предоставляет способ определения требуемого размера буфера. Если mbstr
это NULL
так, count
игнорируется.
Если wcstombs_s
имеется широкий символ, он не может преобразоваться в многобайтовый символ, он помещает 0 в*ReturnValue
, задает целевой буфер пустой строке, errno
задает значение EILSEQ
и возвращает.EILSEQ
Если последовательности, на которые указывают параметры wcstr
и mbstr
, перекрываются, то поведение wcstombs_s
не определено.
Внимание
Убедитесь, что строки wcstr
и mbstr
не перекрываются и что параметр count
правильно отражает количество преобразуемых расширенных символов.
Функция wcstombs_s
использует текущий языковой стандарт для любых аспектов поведения, зависящих от языкового стандарта; функция _wcstombs_s_l
идентична wcstombs
за исключением того, что она использует переданный языковой стандарт. Дополнительные сведения см. в разделе Locale.
В C++ использование данных функций упрощено наличием шаблонных перегрузок; перегруженные методы могут автоматически определять длину буфера (что исключает необходимость указания аргумента с размером буфера), а также они могут автоматически заменять более старые, незащищенные функции их новыми безопасными аналогами. Дополнительные сведения см. в разделе "Безопасные перегрузки шаблонов".
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Требования
Маршрут | Обязательный заголовок |
---|---|
wcstombs_s |
<stdlib.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
Эта программа иллюстрирует поведение функции wcstombs_s
.
// crt_wcstombs_s.c
// This example converts a wide character
// string to a multibyte character string.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define BUFFER_SIZE 100
int main( void )
{
size_t i;
char *pMBBuffer = (char *)malloc( BUFFER_SIZE );
const wchar_t*pWCBuffer = L"Hello, world.";
printf( "Convert wide-character string:\n" );
// Conversion
wcstombs_s(&i, pMBBuffer, (size_t)BUFFER_SIZE,
pWCBuffer, (size_t)BUFFER_SIZE - 1); // -1 so the appended NULL doesn't fall outside the allocated buffer
// Output
printf(" Characters converted: %u\n", i);
printf(" Multibyte character: %s\n\n", pMBBuffer );
// Free multibyte character buffer
if (pMBBuffer)
{
free(pMBBuffer);
}
return 0;
}
Convert wide-character string:
Characters converted: 14
Multibyte character: Hello, world.
См. также
Преобразование данных
Локаль
_mbclen
, , mblen
_mblen_l
mbstowcs
, _mbstowcs_l
mbtowc
, _mbtowc_l
wctomb_s
, _wctomb_s_l
WideCharToMultiByte