文章目錄
- 🚀前言
- 🚀庫函數strlen
- ??strlen的模擬實現
- 🚀庫函數strcpy
- ??strcpy的模擬實現
- 🚀strcmp
- ??strcmp的模擬實現
- 🚀strstr
- ??strstr的模擬實現
- 🚀strcat
- ??strcat的模擬實現
🚀前言
今天阿輝將為大家介紹字符串庫函數strlen
、strcpy
、strcmp
、strstr
、strcat
的使用以及模擬實現,關注阿輝不迷路哦 😘 ,內容干貨滿滿😋,接下來就跟著阿輝一起學習吧👊
🚀庫函數strlen
庫函數strlen
是專門求字符串長度的庫函數,strlen
只能求字符串長度且要求字符串末尾須有\0
,返回值長度不包括\0
strlen
的函數聲明
size_t strlen(const char* src);
返回值為size_t類型
接受一個字符串的首元素地址,即可返回字符串長度
例子:
#include<stdio.h>
#include<string.h>int main()
{char* a = "abcdef";`//末尾有\0char c[] = { 'a','b','c','d','e','f' };//末尾無\0printf("%zd\n", strlen(a));printf("%zd\n", strlen(c));return 0;
}
輸出:
上圖我們可以看到一個輸出6
而一個卻是42
,就是因為常量字符串a
末尾有\0
而字符串數組c
末尾無\0
,而庫函數strlen
計算的長度是從字符串首元素到\0
之間的元素個數,若字符串末尾無\0
,strlen
則會一直向后找到\0
位置然后返回。在C語言中\0
堪稱字符串的靈魂,后面幾個函數會讓大家有更深的體會。
??strlen的模擬實現
鐵子們,咱們直接代碼以及詳解奉上👇
size_t my_strlen(const char* src)
{assert(src != NULL);//斷言判斷傳入指針不為空size_t ret = 0;//記錄字符串長度,作為返回值while (*src++)//這句代碼下面單獨解釋{ret++;}return ret;
}
關于
while(*src++)
這句代碼,因為后置++
的優先級更高所以src++
,但是又因為后置++
實現使用后++
,所以*src++
這個表達式的值是*src
然后src
再加1
,然后當指針src
偏移到\0
位置時while
循環就停止了因為\0
的本質就是0
🚀庫函數strcpy
庫函數strcpy
是用來用來拷貝字符串的
strcpy
的函數聲明:
char* strcpy(char* dest, const char* src);
把從src地址開始到\0的字符串復制到以dest開始的地址空間
返回值為拷貝位置起始地址
注意:
- 將源指向的 C 字符串復制到目標指向的數組中,包括終止空字符(并在該點停止)
- 源字符串必須以 ‘\0’ 結束。
- 會將源字符串中的 ‘\0’ 拷貝到目標空間。
- 目標空間必須足夠大,以確保能存放源字符串。
- 目標空間必須可變
例子:
int main()
{char a[] = "abcd";char b[10] = { 0 };strcpy(b, a);printf("%s",b);return 0;
}
輸出:
abcd
??strcpy的模擬實現
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;//記下目標位置起始地址assert(dest && src);//斷言判斷傳入的指針不為空while (*dest++ = *src++){;}return ret;//返回目標位置起始地址
}
*dest++ = *src++這段代碼可以理解為先進行*dest = *src ,然后dest = dest + 1; src = src + 1,當src
指向\0
時,\0
賦給*dest
然后跳出循環
🚀strcmp
庫函數strcmp
的函數聲明:
int strcmp(const char* str1, const char* str2);
strcmp
是用來比較字符串大小的函數,但并非是以字符串長度比較的,而是從兩個字符串的起始位置開始,一一對應地進行比較,如果它們彼此相等,則繼續以下對,直到字符不同或達到\0
,字符不同時比較的是ASII值大小
返回值:
- 第一個字符串大于第二個字符串,則返回大于0的數字
- 第一個字符串等于第二個字符串,則返回0
- 第一個字符串小于第二個字符串,則返回小于0的數字
例子:
int main()
{char a[] = "adc";char b[] = "abcd";int ret = strcmp(a, b);printf("%d ", ret);return 0;
}
輸出:
1
??strcmp的模擬實現
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')//兩字符串相等,同時指向字符串末尾的\0return 0;str1++;str2++;}return *str1 - *str2;//不等位置相減
}
🚀strstr
庫函數strstr
的函數聲明:
char* strstr(const char* str1, const char* str2);
strstr
函數是用來判斷主串str1
中是否存在子串str2
,如果存在則返回str1
中第一次出現子串的起始位置地址,否則返回NULL
阿輝作圖給大家展示一下:
int main()
{char a[] = "abcdsfejsl";char b[] = "dsfe";printf("%s", strstr(a, b));return 0;
}
輸出:
dsfejsl
因為返回的是主串中子串起始位置地址,上述代碼中也就是d
位置的地址,用%s
打印就是dsfejsl
這一段
??strstr的模擬實現
char* my_strstr(const char* dest, const char* src)
{assert(dest && src);//斷言判斷不為空char* ret = dest;//ret作返回值,記錄主串下一個起始比對位置char* p = src;//記錄子串的起始位置if (*src == '\0')//子串為空直接返回主串{return ret;}while (*dest)//遍歷到主串\0位置跳出循環{//從主串起始比對位置與子串一一比對while (*dest++ == *src++)//不相等時跳出循環{if (*dest == '\0')//當主串遍歷到\0位置還進來,說明子串也到末尾\0位置了,直接返回主串起始比對位置{return ret;}}if (*src == '\0')//跳出循環時,src已到\0位置說明主串中找到子串,返回主串起始比對位置{return ret;}dest = ++ret;//上述if都沒進去說明該主串起始比對位置找不到子串,++ret記錄下一個起始比對位置,并把值賦給dest,從下一個起始比對位置開始遍歷src = p;//src返回子串起始位置}return NULL;//上述都為返回說明找不到,返回空
}
鐵子們不懂的話,下面這幅圖還有解釋:
🚀strcat
庫函數strcat
的函數聲明:
char* strcat(char* dest, const char* src);
strcat
庫函數是用來把src所指向的字符串(包括\0
)復制到dest所指向的字符串后面(刪除*dest
原來末尾的\0
)。要保證*dest
足夠長,以容納被復制進來的*src
。*src
中原有的字符不變。返回指向dest
的指針
例子:
int main()
{char a[20] = "abc";char b[] = "dsfe";printf("%s\n", strcat(a, b));return 0;
}
輸出:
abcdsfe
??strcat的模擬實現
char* my_strcat(char* dest, const char* src)
{assert(dest && src);//斷言判斷不為空char* ret = dest;//記錄起始地址作為返回值while (*dest)//找到目標字符串\0位置{dest++;}while (*dest++ = *src++){;}return ret;
}
while (*dest++ = *src++)
這段代碼前面大家見得多了,實在不理解可以自己敲出來試試,這里阿輝復制粘貼一下😘
*dest++ = *src++這段代碼可以理解為先進行*dest = *src ,然后dest = dest + 1; src = src + 1,當src
指向\0
時,\0
賦給*dest
然后跳出循環
到這里,阿輝今天對于C語言中部分字符函數的分享就結束了,希望這篇博客能讓大家有所收獲, 如果覺得阿輝寫得不錯的話,記得給個贊唄,鐵子們的支持是我創作的最大動力🌹