1. 程式人生 > >01 strcpy()、memset()函式詳解

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;
}