01 strcpy()、memset()函式詳解
strcpy():strcpy(dest,src); strcpy把src所指向以'\0'結尾的字串複製到dest所指的陣列中,返回指向dest的指標。
當sizeof(dest)>=sizeof(src)時,拷貝正確,並在dest字串後面加入'\0';
當sizeof(dest)<sizeof(src)時,拷貝出錯。這個迴圈會一直執行,直到迴圈條件為空,即'\0',也就是說,如果strDest所指的儲存空間不夠大的話,這個函式會將strSrc中的部分內容拷貝到strDest所指記憶體空間後面的記憶體中。而strDest所指空間後面的記憶體卻是不可知的,有可能已經被其他資源佔用了,這樣就會破壞原先儲存的內容,導致系統崩潰。
strncpy():strncpy(dest,src,n); strncpy把src所指向以'\0'結尾的字串的前n個字元複製到dest所指的陣列中,返回指向dest的指標。
當n>=sizeof(src)時,拷貝正確,並在dest字串後面加入'\0';
當n<sizeof(src)時,只拷貝src前n-1個字串到dest,不會為dest字串後面加入'\0';所以是不安全的,複製完後需要手動新增字串的結束符才行。
strcpy()函式是C語言中的一個複製字串的庫函式,以下將詳細解釋說明一下:
· 函式宣告以及實現程式碼
char * strcpy(char *dst,const char *src)
{
if((dst==NULL)||(src==NULL))
return NULL;
char *ret = dst; //[1]
while ((*dst++=*src++)!='\0'); //[2]
return ret;//[3]
}
(1)const 修飾:源字串引數用const修飾,防止修改源字串;
(2)空指標檢查:源指標和目的指標都有可能會出現空指標的情況,所以應該對其進行檢查;
(3)為什麼要設定ret 指標以及返回ret指標的位置[3],由於目的指標dst已經在進行移動了,所以用輔助指標ret表明首指標;
(4)以上所示[2]處,為簡單的字串的複製過程,正好表明strcpy函式遇到'\0'將會停止;另外while ((*dst++=*src++)!='\0');可寫為:
while ((*dst=*src)!='\0'){ //該判斷決定複製的字串結尾為"\0"
dst++;
src++;}
所以,dst指標已經移動,使用ret進行返回。
char* strncpy(char* dest, const char* source, size_t count)
{
char* start=dest;
while (count && (*dest++=*source++))
count--;
if(count) //當sizeof(source)> count,count=0;當sizeof(source)< count,後加'\n'
while (--count)
*dest++='\0';
return(start);
}
memset主要用於為新申請的記憶體進行初始化,它是對較大的結構體和陣列進行清零操作的一種最快方法。
函式原型:void *memset(void *s, int ch, size_t n);
函式解釋:將s中前n個位元組用ch填充,並返回s。
對於這些最基本的函式,總有一種衝動想知道其是怎麼實現的。
下面就是根據原始碼而來的memset實現:
void* memset(void* dst,int val, size_t count)
{
void* ret = dst;
while(count--)
{
*(char*)dst = (char)val;
dst = (char*)dst + 1; //移動一個位元組
}
return ret;
}