Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Różne rozmiary znaków mogą powodować problemy podczas umieszczania znaków w buforze. Rozważmy następujący kod, który kopiuje znaki z ciągu , szdo buforu, rgch:
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
Pytanie brzmi: Czy ostatni bajt skopiował bajt ołowiu? Następujące polecenie nie rozwiązuje problemu, ponieważ może on potencjalnie przepełnić bufor:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Wywołanie _mbccpy próbuje wykonać prawidłową czynność — skopiuj pełny znak, niezależnie od tego, czy jest to 1, czy 2 bajty. Nie uwzględnia jednak, że ostatni skopiowany znak może nie mieścić się w buforze, jeśli znak ma 2 bajty szerokości. Poprawne rozwiązanie to:
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Ten kod testuje możliwe przepełnienie buforu w teście pętli, używając polecenia _mbclen w celu przetestowania rozmiaru bieżącego znaku wskazywanego przez sz. Wykonując wywołanie _mbsnbcpy funkcji, możesz zastąpić kod w while pętli pojedynczym wierszem kodu. Na przykład:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );