static _Elem *__CLRCALL_OR_CDECL _Copy_s(_Elem *_First1, size_t _Dest_size,
const _Elem *_First2, size_t _Count)
{ // copy [_First1, _First1 + _Count) to [_First2, ...)
// _DEBUG_POINTER(_First1);
// _DEBUG_POINTER(_First2);
_SCL_SECURE_CRT_VALIDATE(_Dest_size >= _Count, NULL);
_Elem *_Next = _First1;
for (; 0 < _Count; --_Count, ++_Next, ++_First2)
assign(*_Next, *_First2);
return (_First1);
}
static _Elem *__CLRCALL_OR_CDECL _Move_s(_Elem *_First1, size_t _Dest_size,
const _Elem *_First2, size_t _Count)
{ // move [_First1, _First1 + _Count) to [_First2, ...)
// _DEBUG_POINTER(_First1);
// _DEBUG_POINTER(_First2);
_SCL_SECURE_CRT_VALIDATE(_Dest_size >= _Count, NULL);
_Elem *_Next = _First1;
if (_First2 < _Next && _Next < _First2 + _Count)//相同的字符串
for (_Next += _Count, _First2 += _Count; 0 < _Count; --_Count)
assign(*--_Next, *--_First2);
else
for (; 0 < _Count; --_Count, ++_Next, ++_First2)
assign(*_Next, *_First2);
return (_First1);
}
_Copy_s和_Move_s两个函数非常相似,不同是_Move_s多相同字符串的判断。如果是相同的字符串,则从字符窜尾倒序复制。顺序复制的话,会造成覆盖问题。