天天看點

strlen,strcpy,strcat,strstr,strcmp,strchr函數的使用和注意事項

strcpy源碼:

char *strcpy(char *strDes, const char *strSrc)   
{   
    assert((strDes != NULL) && (strSrc != NULL));   
    char *address = strDes;   
    while ((*strDes ++ = *strSrc ++) != '\0')   
        NULL;   
    return address;   
           

注意:strcpy隻是複制字元串,但不限制複制的數量。很容易造成緩沖溢出,也就是說,不過dest有沒有足夠的空間來容納src的字元串,它都會把src指向的字元串全部複制到從dest開始的記憶體

strcmp源碼:

int strcmp(const char *s, const char *t)   
{   
    assert(s != NULL && t != NULL);   
    while (*s && *t && *s == *t)   
    {   
        ++ s;   
        ++ t;   
    }   
    return (*s - *t);   
}  

           

strcat源碼:

char *strcat(char *strDes, const char *strSrc)   
{   
  
 assert((strDes != NULL) && (strSrc != NULL));   
    char *address = strDes;   
    while (*strDes != '\0')   
        ++ strDes;   
    while ((*strDes ++ = *strSrc ++) != '\0')   
        NULL;   
    return address;   
}  
           

注意:1.不能向形參傳遞指向字元串常量的指針(本題中dst和src都是指向串常量的指針,字元串常量存儲在常量區不能被修改          

            2.傳遞的字元數組前一個實參的所配置設定的記憶體空間必須足夠大

strlen源碼:

int strlen(const char *str)   
{   
    assert(str != NULL);   
    int len = 0;   
    while (*str ++ != '\0')   
        ++ len;   
    return len;   
}  
           

strstr源碼:

char *strstr(const char *strSrc, const char *str)   
{   
    assert(strSrc != NULL && str != NULL);   
    const char *s = strSrc;   
    const char *t = str;   
    for (; *t != '\0'; ++ strSrc)   
    {   
        for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)   
            NULL;   
  
        if (*t == '\0')   
            return (char *) strSrc;   
    }   
    return NULL;   
}  

           

strchr源碼:

char * __cdecl strchr (
                      constchar * string,
                      int ch
                       )
{
   while (*string && *string != (char)ch)
        string++;

   if (*string == (char)ch)
       return((char *)string);
    return(NULL);
}
           

斷言:assert(表達式)如果表達式的值為假,整個程式将退出,并輸出一條錯誤資訊。如果表達式的值為真則繼續執行後面的語句,使用這個宏前需要包含頭檔案assert.h

結語:函數就向一個黑盒一樣,調用它的人給他輸入(調用它本身就是一種輸入),然後等待一個理想中的輸出或者是相應的操作。調用者是希望我們的這個函數能夠非常健壯的讓他們利用,那麼為了使我們的函數擁有一定的魯棒性。

繼續閱讀