共用方式為


緩衝區溢位

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

另請參閱

MBCS 程式設計提示