關於拷貝函數的實現解析

關於拷貝函數分爲兩類,一類是strcpy,strncpy,第二類是memcpy,memove,通常情況下,第一類只能處理char,char*的字符串類型,第二種可以處理任意類型,它們四個函數都在C語言的庫函數中,頭文件爲string.h。它們的原型分別如下:

char *strcpy( char *strDestination, const char *strSource );

char *strncpy( char *strDest, const char *strSource, size_tcount );

void *memcpy( void *dest, const void *src, size_tcount );

void *memmove( void *dest, const void *src, size_tcount );

這裏有個小的知識點就是void *後面加參數,表示可接受任意類型。

在字符串拷貝函數中,strcpy表示的是不受限制的複製字符串拷貝函數,所謂的不受限制就是說它們只是通過尋找字符串結尾的'\0'來判斷它的長度在使用時,程序員必須保證結果字符串不會溢出這塊內存。使用這個函數時需要注意的事項:

1.如果參數src和dst在內存中出現重疊現象,其結果是未定義的。

2.由於dst參數將進行修改,所以它必須是一個字符數組或指向動態分配內存的數組的指針,不能使用字符串常量。

3.參數src是不變的,應用const修飾。

4.目標參數以前的內容將覆蓋並丟失,即使源字符串比目標字符串更短,目標字符串最後剩餘的字符也會丟失。

下面我們來模擬實現一下:

char* my_strcpy(char *dst,char *src)
{
	assert(dst);
	assert(src);
	while(*src = '\0')
	{
		*dst++ = *src++;
	}
	return dst;
}
受限制的字符串拷貝函數strncpy,所謂受限制,就是C標準庫中包含了一些函數,他們用不同的方式處理字符串,這些函數接受一個顯示長度的參數,用於限定進行復制或比較的字符數,這些函數提供了一種方便的機制,可以預防難以預料的長字符串從他們的目標數組中溢出。

下面我們來模擬實現一下strncpy函數:

char *my_strncpy(char *dst,const char *src,int len)
{
         assert(dst);
         assert(src);
         char *pdst = dst;
         while(len--){
               *dst++ = *src++;
          }
          *dst = '\0';
           return pdst;
}
memcpy和memove都是拷貝函數,但memove考慮到兩個緩存區的重疊問題,通常情況下一般用memove來進行拷貝,因爲memcpy屬於memove的一種情況,這裏我們只實現memove函數。當目標地址低於原始地址時,應從前往後拷貝,當目標地址高於原始地址時,應從後往前拷貝。

下面我們來模擬實現一下memove函數:

void *my_memmove(void *dst, void *src, int count)
{
	assert(dst);
	assert(src);
	char *_dst = (char*)dst;
	char *_src = (char*)src;
	char *ret = _dst;

	if (_src < _dst && _src + count > _dst){//後-》前
		char *_dst_end = _dst + count - 1;
		char *_src_end = _src + count - 1;
		while (count--){
			*_dst_end = *_src_end;
			_dst_end--, _src_end--;
		}

	}else{
		while (count--){
			*_dst = *_src;
			_dst++, _src++;
		}
	}
	return ret;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章