Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Olika teckenstorlekar kan orsaka problem när du placerar tecken i en buffert. Tänk på följande kod, som kopierar tecken från en sträng, , sztill en buffert, rgch:
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
Frågan är: Kopierades den senaste bytet en leadbyte? Följande löser inte problemet eftersom det potentiellt kan spilla över bufferten:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Anropet _mbccpy försöker göra rätt – kopiera tecknet i sin helhet, oavsett om det är 1 eller 2 byte. Men det tar inte hänsyn till att det sista tecknet som kopieras kanske inte passar bufferten om tecknet är 2 byte brett. Rätt lösning är:
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Den här koden testar möjliga buffertöverflöden i looptestet med hjälp av _mbclen för att testa storleken på det aktuella tecknet som pekas på av sz. Genom att göra ett anrop till _mbsnbcpy funktionen kan du ersätta koden i loopen while med en enda kodrad. Till exempel:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );