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
См. также
Ссылки
Интерпретация последовательностей многобайтового символов
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