В некоторых случаях мне действительно нужна функция strncpy ()
- например, у меня есть функция в предопределенном интерфейсе, которой передается адрес буфера и размер буфера:
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
, как раньше), или он просто запустит обработчик ошибок неверных параметров один раз строка имеет длину
или больше, иначе программа будет работать с неопределенным поведением.
Решение, которое я применял до сих пор, - просто определить _CRT_SECURE_NO_WARNINGS
и заставить компилятор отключиться.
есть ли способ использовать strncpy_s ()
как фактическую замену strncpy ()
?