●🧑個人主頁:你帥你先說.
●📃歡迎點贊👍關注💡收藏💖
●📖既選擇了遠方,便只顧風雨兼程,
●🤟歡迎大家有問題隨時私信我!
●🧐著作權:本文由[你帥你先說.]原創,CSDN首發,侵權必究,
目錄
- 字符函式
- strlen
- strcpy
- strcat
- strcmp
- strncpy
- strncat
- strncmp
- strstr
- strtok
字符函式
頭檔案
#include<string.h>
strlen
函式引數
> size_t strlen ( const char * str );
💡:
1.字串以'\0'作為結束標志,strlen函式回傳的是在字串中 ‘\0’ 前面出現的字符個數(不包
含 ‘\0’ ),
2.引數指向的字串必須要以'\0' 結束,
3.注意函式的回傳值為size_t,是無符號的( 易錯 ),size_t即unsigned int,
為什么說這是易錯的,舉個🌰
int main()
{
if (strlen("abc") - strlen("abcdef") > 0)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
這段代碼的輸出結果是列印hehe還是haha?很多人會以為3-6=-3小于0,所以列印haha,但剛剛強調過了,strlen函式的回傳值是unsigned int型,兩個unsigned int型的數相級訓是unsigned int型的,我們知道unsigned int型別的是恒大于等于0的,所以是列印hehe,
strcpy
函式引數
char* strcpy(char * destination, const char * source )
這個函式怎么使用呢?我們來看看
Copies the C string pointed by source into the array pointed by destination, including the
terminating null character (and stopping at that point),

來個中文版的,把源指向的字串內容拷貝到目標指向的陣列中,包括終止空字符(即’\0’),
💡:
1.源字串必須以'\0'結束,
2.源字串中的 '\0' 會被拷貝到目標空間,
3.目標空間必須足夠大,以確保能存放源字串,
4.目標空間必須可變,
strcat
函式引數
char * strcat ( char * destination, const char * source );
這是個字串追加函式,第一個引數是你要追加的字串,第二個引數是你要追加的內容,
💡:
1.源字串必須以'\0' 結束,
2.目標空間必須有足夠的大,能容納下源字串的內容,
3.目標空間必須可修改,
模擬實作
char* my_strcat(char* dest,const char* src)
{
assert(dest && src);
char* ret=dest;//目標空間的起始地址
while(*dest !='\0')
{
dest++;
}
while(*dest++=*src++)
{
;
}
return ret;
}
strcmp
函式引數
int strcmp ( const char * str1, const char * str2 );
這個函式我們比較熟悉,兩個引數就是要比較的兩個字符陣列,strcmp是比較字串的內容,不是長度,什么意思呢?
舉個🌰
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = "abe";
printf("%d", strcmp(arr1, arr2));
return 0;
}
如果是比較長度,最終應該回傳0,我們看看運行結果

如果比的是長度,回傳值應該是1,卻回傳了小于0的數,說明比的是內容,這個函式是每個字符進行比較,相等就比下一個,不相等就比ASCII碼值,
我再舉個🌰
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abf";
char arr2[] = "abcd";
printf("%d", strcmp(arr1, arr2));
return 0;
}

這時候你就明白了,比的是內容不是長度,當遇到不相等的時候比較完,后面的字符也不再比較了,
💡:
1.第一個字串大于第二個字串,則回傳大于0的數字
2.第一個字串等于第二個字串,則回傳0
3.第一個字串小于第二個字串,則回傳小于0的數字
模擬實作
my_strcmp(const char* s1,const char* s2)
{
assert(s1&&s2);
while(*s1==*s2)
{
if(*s1=='\0')
return 0;
s1++;
s2++;
}
return *s1-*s2;
}
strcpy、strcat、strcmp都是長度不受限制的字串函式,所以就顯得不夠安全,所以就有了strncpy、strncat、strncmp函式,
strncpy
函式引數
char * strncpy ( char * destination, const char * source, size_t num );
前兩個引數和strncpy一樣,不同的是第三個引數可以指定拷貝的個數,
strncat
函式引數
char * strncat ( char * destination, const char * source, size_t num );
和strncpy類似,也是多了個可以控制個數的引數,
但這里和strcat還是有區別的,
strcat
char arr1[20]="abcdxxxx";
char arr2[]="efg";
strcat(arr1,arr2);
此時字串的輸出結果應該是abcdxxxx
strncat
char arr1[20]="abcdxxxx";
char arr2[]="efg";
strncat(arr1,arr2,3);
此時字串輸出結果是abcdefg,追加后會自動添上'\0',
如果第三個引數的數大于你要追加的字串的個數,實際上還是只追加了整個字串,且結尾添上’\0’,
strncmp
函式引數
int strncmp ( const char * str1, const char * str2, size_t num );
這里只比strcmp函式多了控制個數,其它與strcmp沒有區別,
strstr
函式引數
char * strstr ( const char *str2, const char * str1);
這是個字串查找函式,這個函式可以幫我們查找一個字串中另一個字串是否存在,如果存在就回傳所查找的字串的起始地址,找不到則回傳空指標
模擬實作
char* my_strstr(const char* str1,const char* str2)
{
assert(str1&&str2);
char* s1;
char* s2;
char* cp=str1;//存放str1的起始地址
if(*str2=='\0')
return str1;//strstr庫里本身的實作方式
while(*cp)
{
s1=cp;//存放str1的起始地址
s2=str2;//存放str2的起始地址
while(*s1&&*s2&&*s1==*s2)
{
s1++;
s2++;
}
if(*s2=='\0')
{
return cp;
}
cp++;
}
return NULL;//找不到,回傳空指標
}
strtok
函式引數
char * strtok ( char * str, const char * sep );
這個函式是干什么的呢?
舉個🌰:
192.16.1.1
以’.‘為分隔符,我們可以把這個ip地址切割成
192
168
1
1
hello@world.com
以@和’.'為分隔符,我們可以把這個網址切割成
hello
world
com
💡:
1.sep引數是個字串,定義了用作分隔符的字符集合
2.第一個引數指定一個字串,它包含了0個或者多個由sep字串中一個或者多個分隔符分割的標
記,
3.strtok函式找到str中的下一個標記,并將其用 \0 結尾,回傳一個指向這個標記的指標,(注:
strtok函式會改變被操作的字串,所以在使用strtok函式切分的字串一般都是臨時拷貝的內容
并且可修改,)
4.strtok函式的第一個引數不為 NULL ,函式將找到str中第一個標記,strtok函式將保存它在字串
中的位置,
5.strtok函式的第一個引數為 NULL ,函式將在同一個字串中被保存的位置開始,查找下一個標
記,
6.如果字串中不存在更多的標記,則回傳 NULL指標,
那這個函式要怎么用呢?
int main()
{
char arr1[] = "zpw@bitedu.tech";
char arr2[100] = { 0 };
char sep[] = "@.";
strcpy(arr2, arr1);
char* ret = NULL;
//分割字串
for (ret=strtok(arr2, sep); ret!=NULL; ret=strtok(NULL, sep))
{
printf("%s\n", ret);//通過傳入NULL讓函式查找下一個標記
}
return 0;
}
離開前

這樣的文章你還不快 點贊👍關注💡收藏💖
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/302002.html
標籤:其他
