В некоторых случаях мне действительно нужно strncpy()
funcitonalty - например, у меня есть функция в предопределенном интерфейсе, которой передается адрес буфера и размер буфера:
HRESULT someFunction( char* buffer, size_t length );
и задокументировано, что я могу скопировать туда строку с нулевым символом в конце длиной не более length
- если она точно равна длине length
Я не завершаю строку в ноль, и вызывающая сторона знает, что строка заканчиваетсялибо с нулевым символом, либо с длиной length
, в зависимости от того, что произойдет раньше, и все это работает.
Конечно, для этого я буду использовать strncpy()
HRESULT someFunction( char* buffer, size_t length )
{
const char* toCopy = ...
size_t actualLength = strlen( toCopy );
if( actualLength > length ) {
return E_UNEXPECTED; // doesn't fit, can't do anything reasonable
}
strncpy( buffer, toCopy, length );
return S_OK;
}
Теперь у меня есть этот код инеобходимо перенести его из Visual C ++ 7 в Visual C ++ 9. Я скомпилирую его и вижу предупреждение о том, что strncpy()
небезопасно , и вместо этого я должен использовать strncpy_s () .
strncpy_s()
предназначен для всегда нулевого завершения буфера, поэтому я не могу использовать его в качестве прямой замены в приведенном выше сценарии.Мне придется возвращать E_UNEXPECTED
в строках длиннее length - 1
(не length
, как ранее), иначе он просто запустит обработчик ошибок недопустимых параметров, когда строка будет length
или длиннее, или программа столкнется снеопределенное поведение.
Решение, которое я применял до сих пор, состоит в том, чтобы просто определить _CRT_SECURE_NO_WARNINGS
и заставить компилятор отключиться.
есть ли способ использовать strncpy_s()
в качестве фактической заменыstrncpy()