關於拷貝函數分爲兩類,一類是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;
}