Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Různé velikosti znaků můžou způsobit problémy při vkládání znaků do vyrovnávací paměti. Představte si následující kód, který kopíruje znaky z řetězce , szdo vyrovnávací paměti: rgch
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
Otázka: Zkopíroval poslední bajt hlavní bajt? Následující problém nevyřeší, protože může potenciálně přetékat vyrovnávací paměť:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Volání _mbccpy se pokusí provést správnou věc – zkopírujte celý znak, ať už je to 1 nebo 2 bajty. Nebere ale v úvahu, že poslední kopírovaný znak nemusí odpovídat vyrovnávací paměti, pokud je znak 2 bajty široký. Správné řešení je:
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Tento kód testuje možné přetečení vyrovnávací paměti v testu smyčky pomocí _mbclen k otestování velikosti aktuálního znaku, na který szodkazuje . Voláním _mbsnbcpy funkce můžete kód ve while smyčce nahradit jedním řádkem kódu. Příklad:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );