Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 ) );