Spec-Zone.ru › C

wmemcpy, wmemcpy_s

Определено в заголовке <wchar.h>
(1)
wchar_t* wmemcpy( wchar_t* dest, const wchar_t* src, size_t count );
(с C95)
(до C99)
wchar_t *wmemcpy(wchar_t *restrict dest, const wchar_t *restrict src,
                 size_t count );
(с C99)
errno_t wmemcpy_s( wchar_t *restrict dest, rsize_t destsz,
                   const wchar_t *restrict src, rsize_t count );
(2) (с C11)
1) Копирует ровно count последовательных широких символов из массива широких символов, на который указывает src, в массив широких символов, на который указывает dest. Если объекты перекрываются, поведение не определено. Если count равно нулю, функция ничего не делает.
2) То же, что и (1), за исключением того, что следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчика ограничений обработчика ограничений:
  • src или dest являются нулевыми указателями
  • destsz или count больше RSIZE_MAX/sizeof(wchar_t)
  • count больше destsz (произошло бы переполнение)
  • произойдет перекрытие между исходным и целевым массивами
Как и во всех функциях с проверкой границ, wmemcpy_s гарантируется доступной только в том случае, если __STDC_LIB_EXT1__ определено реализацией, и если пользователь определил __STDC_WANT_LIB_EXT1__ как целую константу 1 до включения <wchar.h>.

Параметры

dest - указатель на массив широких символов, в который нужно скопировать
src - указатель на массив широких символов, из которого нужно скопировать
count - количество широких символов для копирования
destsz - максимальное количество широких символов для записи (размер буфера назначения)

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

1) возвращает копию dest
2) возвращает ноль при успехе, ненулевое значение при ошибке. Также при ошибке заполняет весь dst до, но не включая dst+dstsz нулевыми широкими символами, L'\0' (если dest является нулевым указателем или destsz больше RSIZE_MAX/sizeof(wchar_t)).

Примечания

Аналогом этой функции для строк байтов является strncpy, а не strcpy.

Эта функция не чувствительна к локали и не обращает внимания на значения wchar_t объектов, которые она копирует: нули и недействительные символы также копируются.

Пример

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
int main(void)
{
    wchar_t from1[] = L"नमस्ते";
    size_t sz1 = sizeof from1 / sizeof *from1;
    wchar_t from2[] = L"Բարև";
    size_t sz2 = sizeof from2 / sizeof *from2;
    wchar_t to[sz1 + sz2];
    wmemcpy(to, from1, sz1); // copy from1, along with its null terminator
    wmemcpy(to + sz1, from2, sz2); // append from2, along with its null terminator
 
    setlocale(LC_ALL, "en_US.utf8");
    printf("Wide array contains: ");
    for(size_t n = 0; n < sizeof to / sizeof *to; ++n)
        if(to[n])
            printf("%lc", to[n]);
        else
            printf("\\0");
    printf("\n");
}

Возможный вывод:

Wide array contains: नमस्ते\0Բարև\0

Ссылки

  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.29.4.2.3 Функция wmemcpy (с. 431)
    • K.3.9.2.1.3 Функция wmemcpy_s (с. 641)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.24.4.2.3 Функция wmemcpy (с. 377)

См. также

wmemmovewmemmove_s
(C95)(C11)
копирует определенное количество широких символов между двумя, возможно перекрывающимися, массивами
(функция)
strncpystrncpy_s
(C11)
копирует определенное количество символов из одной строки в другую
(функция)
Документация C++ для wmemcpy

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

Spec-Zone.ru

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