天天看點

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

【C語言】字元 / 字元串 庫函數的模拟實作

函數聲明:

size_t strlen(const char *str)

作用:

計算字元串 str 的長度,直到空結束字元,但不包括空結束字元。

參數:

str – 要計算長度的字元串。

傳回值:

該函數傳回字元串的長度。

  • 字元串已經 ‘\0’ 作為結束标志,strlen函數傳回的是在字元串中 ‘\0’ 前面出現的字元個數(不包含 ‘\0’ )。
  • 參數指向的字元串必須要以 ‘\0’ 結束。
  • 注意函數的傳回值為size_t,是無符号的( 易錯 )

以下附上三種實作方法

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

char *strcpy(char *dest, const char *src)

把 src 所指向的字元串複制到 dest

dest – 指向用于存儲複制内容的目标數組。

src – 要複制的字元串。

該函數傳回一個指向最終的目标字元串 dest 的指針。

  • 源字元串必須以 ‘\0’ 結束。
  • 會将源字元串中的 ‘\0’ 拷貝到目标空間。
  • 目标空間必須足夠大,以確定能存放源字元串。
  • 目标空間必須可變。

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

函數聲明:

char * strcat ( char * destination, const char * source );

把 src 所指向的字元串追加到 dest 所指向的字元串的結尾。

dest – 指向目标數組,該數組包含了一個 C 字元串,且足夠容納追加後的字元串。

src – 指向要追加的字元串,該字元串不會覆寫目标字元串。

  • 源字元串必須以 ‘\0’ 結束 。
  • 目标空間必須有足夠的大,能容納下源字元串的内容。
  • 目标空間必須可修改。

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

int strcmp(const char *str1, const char *str2)

把 str1 所指向的字元串和 str2 所指向的字元串進行比較。

str1 – 要進行比較的第一個字元串。

str2 – 要進行比較的第二個字元串。

該函數傳回值如下:

如果傳回值小于 0,則表示 str1 小于 str2。

如果傳回值大于 0,則表示 str1 大于 str2。

如果傳回值等于 0,則表示 str1 等于 str2。

比較到出現另個字元不一樣或者一個字元串結束或者num個字元全部比較完。

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

char *strstr(const char *haystack, const char *needle)

在字元串 haystack 中查找第一次出現字元串 needle 的位置,不包含終止符 ‘\0’。

haystack – 要被檢索的 C 字元串。 needle – 在 haystack 字元串内要搜尋的小字元串。

該函數傳回在 haystack 中第一次出現 needle 字元串的位置,如果未找到則傳回 null。

這裡用到的是BF算法,将目标字元串跟原字元串依次作比較,找到子串,了解較為簡單

(其實還可以用KMP算法來寫)

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

void *memcpy(void str1, const void str2, size_t n)

從存儲區str2 複制 n 個位元組到存儲區 str1。

str1 – 指向用于存儲複制内容的目标數組,類型強制轉換為 void 指針。

str2 – 指向要複制的資料源,類型強制轉換為 void 指針。

n – 要被複制的位元組數。

該函數傳回一個指向目标存儲區 str1 的指針。

函數memcpy從str2的位置開始向後複制n個位元組的資料到str1的記憶體位置。

這個函數在遇到 ‘\0’ 的時候并不會停下來。

如果str1和str2有任何的重疊,複制的結果都是未定義的。

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

void *memmove(void str1, const void str2, size_t n)

從 str2 複制 n 個字元到 str1,但是在重疊記憶體塊這方面,memmove() 是比 memcpy() 更安全的方法。如果目标區域和源區域有重疊的話,memmove() 能夠保證源串在被覆寫之前将重疊區域的位元組拷貝到目标區域中,複制後源區域的内容會被更改。如果目标區域與源區域沒有重疊,則和 memcpy() 函數功能相同。

和memcpy的差别就是memmove函數處理的源記憶體塊和目标記憶體塊是可以重疊的。

如果源空間和目标空間出現重疊,就得使用memmove函數處理。

重寫的時候必須要厘清楚情況:

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

是以模拟memmove函數的核心重點在于

【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數
【C語言】常用庫函數的介紹與模拟實作(有手就行)——— 字元 / 字元串 庫函數strlen函數strcpy函數strcat函數strcmp函數

繼續閱讀