幾個典型的記憶體拷貝及字串函式實現

2021-09-09 03:49:13 字數 1947 閱讀 8562

寫乙個函式,完成記憶體之間的拷貝。[考慮問題是否全面,是否考慮記憶體重疊問題]

返回void *支援鏈式操作,引數型別是void *以支援任意型別的指標,輸入引數加上const修飾,最好加上assert對輸入輸出指標進行非null判斷

void* memcpy( void *dest, const void *src, size_t count )

char* pdest = static_cast( dest );

const char* psrc = static_cast( src );

// 依次從前拷貝,目的位址覆蓋了源位址的數,此時從後往前拷貝

if( (pdest>psrc) && (pdest<(psrc+count))) //能考慮到這種情況就行了

for( size_t i=count-1; i!=-1; --i )

pdest[i] = psrc[i];

else

for( size_t i=0; ipdest[i] = psrc[i];

return dest;

int main( void )

char str = "0123456789";

memcpy( str+1, str+0, 9 );

cout << str << endl;

memcpy( str, str+5, 5 );

cout << str << endl;

system( "pause" );

return 0;

// 0012345678

// 4567845678

strcmp():

int ******_strcmp (const char *s1, const char *s2)

{ int ret;

while ((ret = *(unsigned char *) s1 - *(unsigned char *) s2++) == 0

&& *s1++);

return ret;

memcmp():

int ******_memcmp (const char *s1, const char *s2, size_t n)

{ int ret = 0;

while (n--&& (ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) == 0);

return ret;

strcmp只判斷s1的『/0』,沒有長度的控制;memcmp有長度引數n的控制

memcpy():

char *******_memcpy (char *dst, const char *src, size_t n)

{ char *ret = dst;

while (n--)

*dst++ = *src++;

return ret;

直接的記憶體之間的copy,不處理記憶體重疊的情況。

strcpy():

char *******_strcpy (char *dst, const char *src)

{ char *ret = dst;

while ((*dst++ = *src++) != '/0'); //相當簡約,一句話即搞定

return ret;

與memcpy區別就是對'/0'作為結束符

strncpy():

char *******_strncpy (char *dst, const char *src, size_t n)

char *ret = dst;

while (n--)

if ((*dst++ = *src++) == '/0')

while (n--)

*dst++ = '/0';

return ret;

return ret;

n和『/0'都作為結束的控制符。如果n過大,則後面全補'/0

幾個典型的記憶體拷貝及字串函式實現

幾個典型的記憶體拷貝及字串函式實現 寫乙個函式,完成記憶體之間的拷貝。考慮問題是否全面,是否考慮記憶體重疊問題 返回void 支援鏈式操作,引數型別是void 以支援任意型別的指標,輸入引數加上const修飾,最好加上assert對輸入輸出指標進行非null判斷 void memcpy void d...

字串拷貝和記憶體拷貝函式

strcpy 拷貝字串 定義函式 char strcpy char dest,const char src strcpy 函式只能拷貝字串。strcpy 函式將源字串src的每個位元組拷貝到目的字串dest中,src字串末尾的 0 也被拷貝過去。strcpy 函式返回引數dest的起始位址。如果引數...

字串拷貝函式

1.strcpy函式 顧名思義字串複製函式 一般函式原型實現方式 該函式的引數是字元指標,也就是可以是字串變數和字元陣列,因為它們的變數名代表首字元位址。字串預設有乙個null結束符,字元陣列沒有。所以此處需要注意 因為src要求有null結束符,所以字元陣列的長度必須大於等於src包含null結束...