Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Различные размеры символов могут вызвать проблемы при помещении символов в буфер. Рассмотрим следующий код, который копирует символы из строки, szв буфер: rgch
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
Вопрос в том: Был ли последний байт копировал байт свинца? Следующее не решает проблему, так как она может потенциально переполнение буфера:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Вызов _mbccpy пытается выполнить правильное действие— скопируйте полный символ, будь то 1 или 2 байта. Но не учитывается, что последний скопированный символ может не соответствовать буферу, если символ имеет ширину 2 байта. Правильное решение:
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Этот код проверяет возможный переполнение буфера в тесте цикла, используя _mbclen для проверки размера текущего символа, на который указывает sz. Вызывая _mbsnbcpy функцию, можно заменить код в while цикле одной строкой кода. Например:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );