前言
本文主要講解C語言的常用的一些函數的自我實現,經常出現在編程筆試題中,實現過程簡單,對於學習C語言的同學來說也是很有幫助的。主要有以下三個函數:
- strcpy:char * strcpy(char * dest, const char * src);
- memcpy:void *memcpy(void *memTo, const void *memFrom, size_t size);
- memmove:void *memmove(void *dst,const void *src,size_t n);
函數介紹
可能大家都知道這三個函數都可以實現拷貝效果,在這裡主要是講下他們之間的區別,strcpy 和 memcpy主要有以下三方面的區別:
- 複製的內容不同。strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符串、整型、結構體、類等。
- 複製的方法不同。strcpy不需要指定長度,它遇到被複製字符串的結束符"\0」才結束,所以容易溢出。memcpy則是根據第3個參數決定複製的長度。
- 用途不同。通常在複製字符串時用strcpy,而需要複製其它類型的數據是用memcpy。
memcpy和memmove區別
當內存發生局部重疊的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。
代碼實現
char * strcpy(char * dest, constchar * src)
char * strcpy(char * dest, const char * src) // 實現src到dest的複製
{
if ((src == NULL) || (dest == NULL)) //判斷參數src和dest的有效性
{
return NULL;
}
char *strdest = dest; //保存目標字符串的首地址
while ((*dest++ = *src++) != '\0'); //把src字符串的內容複製到dest下
return strdest;
}
測試結果:(不考慮secondStr長度大於firstStr的問題!)
void *memcpy(void *memTo, const void *memFrom, size_t size)
void *memcpy(void *memTo, const void *memFrom, size_t size)
{
if ((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效
return NULL;
char *tempTo = (char *)memTo; //保存memTo首地址
while (size-- > 0) //循環size次,複製memFrom的值到memTo中
*tempTo++ = *((char *)memFrom)++;
return memTo;
}
測試結果:
順帶一提,自定義類型的數據即可:
void *memmove(void *dst,const void *src,size_t n)
void *memmove(void *dst,const void *src,size_t n)
{
char *dp = (char *)dst;
char *sp = (char *)src;
if(dst==NULL || src==NULL)return NULL;
//非重疊
//dp < sp
//dp > (sp+n)
if(sp>dp||(sp+n)<dp)
{
while(n--)
*(dp++) = *(sp++);
}
else if(sp<dp)//重疊 (此時條件 sp<dp<(sp+n))如果sp==dp則快速的返回
{//反向拷貝
sp += n;
dp += n;
while(n--)
*(--dp) = *(--sp);
}
return dst;
}
測試結果:
尾言
文章都是手打原創,每天最淺顯的介紹C語言、C++,windows知識,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。如果足下基礎比較差,不妨關注下人人都可以學習的視頻教程
通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢