當您將字元放入緩衝區時,不同的字元大小可能會導致問題。 請考慮下列程式代碼,其會將字元從字串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 ) );