strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

Символы копии одной строки в другую.Существуют более безопасные версии этих функций; см. раздел strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l.

Важное примечаниеВажно

_mbsncpy и _mbsncpy_l нельзя использовать в приложениях, выполняемых в Среда выполнения Windows.Дополнительные сведения см. в разделе Функции CRT не поддерживаются при /ZW.

char *strncpy(
   char *strDest,
   const char *strSource,
   size_t count 
);
char *_strncpy_l(
   char *strDest,
   const char *strSource,
   size_t count,
   locale_t locale 
);
wchar_t *wcsncpy(
   wchar_t *strDest,
   const wchar_t *strSource,
   size_t count 
);
wchar_t *_wcsncpy_l(
   wchar_t *strDest,
   const wchar_t *strSource,
   size_t count,
   locale_t locale 
);
unsigned char *_mbsncpy(
   unsigned char *strDest,
   const unsigned char *strSource,
   size_t count 
);
unsigned char *_mbsncpy_l(
   unsigned char *strDest,
   const unsigned char *strSource,
   size_t count,
   _locale_t locale
);
template <size_t size>
char *strncpy(
   char (&strDest)[size],
   const char *strSource,
   size_t count 
); // C++ only
template <size_t size>
char *_strncpy_l(
   char (&strDest)[size],
   const char *strSource,
   size_t count,
   locale_t locale 
); // C++ only
template <size_t size>
wchar_t *wcsncpy(
   wchar_t (&strDest)[size],
   const wchar_t *strSource,
   size_t count 
); // C++ only
template <size_t size>
wchar_t *_wcsncpy_l(
   wchar_t (&strDest)[size],
   const wchar_t *strSource,
   size_t count,
   locale_t locale 
); // C++ only
template <size_t size>
unsigned char *_mbsncpy(
   unsigned char (&strDest)[size],
   const unsigned char *strSource,
   size_t count 
); // C++ only
template <size_t size>
unsigned char *_mbsncpy_l(
   unsigned char (&strDest)[size],
   const unsigned char *strSource,
   size_t count,
   _locale_t locale
); // C++ only

Параметры

  • strDest
    Строка назначения.

  • strSource
    Строка источника.

  • count
    Число копируемых знаков.

  • locale
    Языковой стандарт, который необходимо использовать.

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

Возвращает strDest.Возвращаемое значение не зарезервировано для отображения ошибки.

Заметки

Функция strncpy копирует начальные символы countstrSource имеет значение strDest и возвращает strDest.Если значение count меньше или равно длину strSource, нуль-символ не добавляется автоматически в скопированной строке.Если count больше, чем длина strSource, строка назначения проложена с нулями-символами до длины count.При перекрытии исходной и конечной строк поведение инструкции strncpy не определено.

Примечание о безопасностиПримечание по безопасности

strncpy не проверяет наличие достаточного места в strDest; это делает его потенциальную причину переполнение буфера.Аргумент count ограничивает число знаков, копированное нет ограничения на размер strDest.См. следующий пример.Дополнительные сведения см. в разделе Как избежать переполнения буфера.

Если strDest или strSource указатель NULL либо если count меньше или равно нулю, то обработчик вызывается недопустимого параметра, как описано в разделе Проверка параметров.Если среда выполнения может продолжить, эти функции возвращают -1 и свойству errno задано значение EINVAL

wcsncpy и _mbsncpy — двубайтовая и многобайтовая символьные версии strncpy.Аргументы и возвращаемое значение зависит от wcsncpy и _mbsncpy соответственно.Эти 6 функций поведение идентично в противном случае.

Версии этих функций с суффиксом _l идентичны за исключением того, что они используют языковой стандарт, в вместо текущего языкового стандарта для них расширения функциональности языкового стандарта, элемента.Для получения дополнительной информации см. Языковой стандарт.

В C++, эти функции имеют перегруженные шаблонные версии, которые вызывают более новые и безопасные аналоги этих функций.Для получения дополнительной информации см. Предоставляйте перегруженный шаблона.

Универсальное текстовое сопоставление функций

Функция TCHAR.H

неопределенные _UNICODE & _MBCS

определенные _MBCS

Определение _UNICODE

_tcsncpy

strncpy

_mbsnbcpy

wcsncpy

_tcsncpy_l

_strncpy_l

_mbsnbcpy_l

_wcsncpy_l

ПримечаниеПримечание

_strncpy_l и _wcsncpy_l не имеют имеет зависимость языкового стандарта; они предназначены только для _tcsncpy_l и не должны вызывать напрямую.

Требования

Функция

Требуемый заголовок

strncpy

<string.h>

wcsncpy

<string.h> или <wchar.h>

_mbsncpy, _mbsncpy_l

<mbstring.h>

Для дополнительных данных о совместимости платформ см. в разделе Совместимость.

Пример

Следующий пример демонстрирует использование strncpy и как их можно использовать его, чтобы вызвать ошибки и вопросы безопасности программы.Компилятор выдает предупреждение при каждом вызове strncpy подобному значение crt_strncpy_x86.c(15) : warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

// crt_strncpy_x86.c
// Use this command in an x86 developer command prompt to compile: 
// cl /TC /W3 crt_strncpy_x86.c

#include <stdio.h>
#include <string.h>

int main() {
   char t[20];
   char s[20];
   char *p = 0, *q = 0;

   strcpy_s(s, sizeof(s), "AA BB CC");
   // Note: strncpy is deprecated; consider using strncpy_s instead
   strncpy(s, "aa", 2);     // "aa BB CC"         C4996
   strncpy(s + 3, "bb", 2); // "aa bb CC"         C4996
   strncpy(s, "ZZ", 3);     // "ZZ",              C4996
                            // count greater than strSource, null added
   printf("%s\n", s);

   strcpy_s(s, sizeof(s), "AA BB CC");
   p = strstr(s, "BB");
   q = strstr(s, "CC");
   strncpy(s, "aa", p - s - 1);   // "aa BB CC"   C4996
   strncpy(p, "bb", q - p - 1);   // "aa bb CC"   C4996
   strncpy(q, "cc",  q - s);      // "aa bb cc"   C4996
   strncpy(q, "dd", strlen(q));   // "aa bb dd"   C4996
   printf("%s\n", s);

   // some problems with strncpy
   strcpy_s(s, sizeof(s), "test");
   strncpy(t, "this is a very long string", 20 ); // C4996
   // Danger: at this point, t has no terminating null,
   // so the printf continues until it runs into one.
   // In this case, it will print "this is a very long test"
   printf("%s\n", t);

   strcpy_s(t, sizeof(t), "dogs like cats");
   printf("%s\n", t);

   strncpy(t + 10, "to chase cars.", 14); // C4996
   printf("%s\n", t);

   // strncpy has caused a buffer overrun and corrupted string s
   printf("Buffer overrun: s = '%s' (should be 'test')\n", s);
   // Since the stack grows from higher to lower addresses, buffer
   // overruns can corrupt function return addresses on the stack,
   // which can be exploited to run arbitrary code.
}

Output

  
  

Макет автоматические переменные и уровня защиты обнаружения ошибок и кода меняется с измененными параметрами компилятора.Этот пример может иметь разные результаты при компиляции или другие встроенные среды с другими параметрами компилятора.

Эквивалент в .NET Framework

System::String::Copy

См. также

Ссылки

Управление строками (CRT)

Языковой стандарт

Интерпретация последовательностей многобайтового символов

_mbsnbcpy, _mbsnbcpy_l

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

strncat, _strncat_l, wcsncat, wcsncat_l, _mbsncat _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strcpy_s, wcscpy_s, _mbscpy_s