![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iYjRWNhVWMkV2NxAzNzgTYjlDN0EzMlJGM3IjMkRWZy8CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
【C語言】字元 / 字元串 庫函數的模拟實作
函數聲明:
size_t strlen(const char *str)
作用:
計算字元串 str 的長度,直到空結束字元,但不包括空結束字元。
參數:
str – 要計算長度的字元串。
傳回值:
該函數傳回字元串的長度。
- 字元串已經 ‘\0’ 作為結束标志,strlen函數傳回的是在字元串中 ‘\0’ 前面出現的字元個數(不包含 ‘\0’ )。
- 參數指向的字元串必須要以 ‘\0’ 結束。
- 注意函數的傳回值為size_t,是無符号的( 易錯 )
以下附上三種實作方法
char *strcpy(char *dest, const char *src)
把 src 所指向的字元串複制到 dest
dest – 指向用于存儲複制内容的目标數組。
src – 要複制的字元串。
該函數傳回一個指向最終的目标字元串 dest 的指針。
- 源字元串必須以 ‘\0’ 結束。
- 會将源字元串中的 ‘\0’ 拷貝到目标空間。
- 目标空間必須足夠大,以確定能存放源字元串。
- 目标空間必須可變。
函數聲明:
char * strcat ( char * destination, const char * source );
把 src 所指向的字元串追加到 dest 所指向的字元串的結尾。
dest – 指向目标數組,該數組包含了一個 C 字元串,且足夠容納追加後的字元串。
src – 指向要追加的字元串,該字元串不會覆寫目标字元串。
- 源字元串必須以 ‘\0’ 結束 。
- 目标空間必須有足夠的大,能容納下源字元串的内容。
- 目标空間必須可修改。
int strcmp(const char *str1, const char *str2)
把 str1 所指向的字元串和 str2 所指向的字元串進行比較。
str1 – 要進行比較的第一個字元串。
str2 – 要進行比較的第二個字元串。
該函數傳回值如下:
如果傳回值小于 0,則表示 str1 小于 str2。
如果傳回值大于 0,則表示 str1 大于 str2。
如果傳回值等于 0,則表示 str1 等于 str2。
比較到出現另個字元不一樣或者一個字元串結束或者num個字元全部比較完。
char *strstr(const char *haystack, const char *needle)
在字元串 haystack 中查找第一次出現字元串 needle 的位置,不包含終止符 ‘\0’。
haystack – 要被檢索的 C 字元串。 needle – 在 haystack 字元串内要搜尋的小字元串。
該函數傳回在 haystack 中第一次出現 needle 字元串的位置,如果未找到則傳回 null。
這裡用到的是BF算法,将目标字元串跟原字元串依次作比較,找到子串,了解較為簡單
(其實還可以用KMP算法來寫)
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有任何的重疊,複制的結果都是未定義的。
void *memmove(void str1, const void str2, size_t n)
從 str2 複制 n 個字元到 str1,但是在重疊記憶體塊這方面,memmove() 是比 memcpy() 更安全的方法。如果目标區域和源區域有重疊的話,memmove() 能夠保證源串在被覆寫之前将重疊區域的位元組拷貝到目标區域中,複制後源區域的内容會被更改。如果目标區域與源區域沒有重疊,則和 memcpy() 函數功能相同。
和memcpy的差别就是memmove函數處理的源記憶體塊和目标記憶體塊是可以重疊的。
如果源空間和目标空間出現重疊,就得使用memmove函數處理。
重寫的時候必須要厘清楚情況:
是以模拟memmove函數的核心重點在于