您好,登錄后才能下訂單哦!
不要懷疑,博主這次真的是在挖墳,今天整理筆記的時候才看見,所以呢,就上來備份一下,這篇呢主要是說一些關于字符串函數的知識點,希望大家以后在使用的時候注意一下!
一、字符串基本知識
1.字符串:顧名思義,字符串即一串字符的組合,并且以NUL結尾,所以我們不能讓'\0'出現在字符串還 沒有結束的地方。
2.NUL:它本身并不是字符串的一部分而是一個我們用來判斷一個字符串結束與否的標識!
3.字符串的分類:常量字符串,字符串數組。
常量字符串
一般來說我們使用常量字符串來保存那些不需要被修改的字符串
字符串數組
存放在數組里的字符串我們可以對其進行增刪和替換
注意:若我們要使用字符串函數必須引頭文件string.h
二、串操作函數
1、字符串的長度度量標尺:strlen
函數原型:size_t strlen(char const *string)
size_t是一個無符號整數類型 所以我們不可以用兩個strlen 的結果減法運算來判斷哪個字符串長。
典型錯誤:if((strlen(str1)-strlen(str2)) >= 0) 該表達式的結果將永遠為真
**表達里面如果同時包含有符號和無符號數結果會變得不一樣
使用減法必須強類型轉換
int main ( ) { char *arr = "ABCD"; int ret1 = strlen( arr ); int ret2 = strlen( arr ) - 10 ; printf( "%d %d\n" , ret1, ret2 ); system( "pause" ); return 0 ; }
結果: 4 -6
2.容易失控的不受長度限制串操作函數
字符串拷貝函數strcpy
由于字符串拷貝函數不能檢測字符串的長度,你給它多少個字符它就拷貝多少個字符,但在程序執行時,多出來的字符會按順序存放在內存空間中,這樣是十分不安全的,你有可能覆蓋掉了內存中其他重要的信息。
當原串和目標串出現內存重疊的時候我們應該考慮原串里面的內容會被覆蓋并丟失,此時我們應該選擇內存拷貝函數memmove來解決這個難題
如果新的字符串短于原字符串那么原字符串里結尾的幾個字符也無法顯示,因為在拷貝時它將字符串里的‘\0’也一起拷貝過來,導致原串中最后幾個字符落在NUL的后面!
字符連接函數strcat
strcat函數同樣不受到長度的限制,我們在將一個字符連接到另一個字符串后面的時候選擇strcat函數,在我們使用時同樣要給目標字符串預留出足夠的空間來容納我們的源串,并且保證它們不會發生內存的重疊。
如果你需要連接的字符串的長度加上目標字符串的長度超過了目標串的總長則會發生段錯誤!
不能自己連接自己!
字符串的比較函數strcmp
字符串的比較函數strcmp的原理是將字符串里的每一個對應字符進行比較,直到找到第一個不相等的字符比較他們的ASCII碼值后給出結論!
被比較的兩個字符串可以長度不同,如果前面的字符都相同,那么短的那個字符串更小!
有一個常見的問題,許多的初學者總是將判斷條件寫成if(strcmp(str1,str2))這種寫法是絕對要避免的,因為該函數的返回值為0時,結果為真(str1=str2),正好和我們平時的邏輯相反!
以上敘述的三個函數都是不受字符串的長度限制,在使用時一定要注意不要忽略可用的字符串的長度(避免字符串數組的越界訪問造成的內存覆蓋丟失等)
3.長受限的串操作函數
strncp(char *dest,const char *src,int n)
該函數在復制時根據傳參時規定的長度復制字符串,如果src的長度小于n那么數組將在未填充部分自動填充NUL來補全,但如果src的長度大于n那么src只會有n個字符被復制,并且該字符串不會以NUL結尾
strncat(char *dest,const char *src,int n)
該函數在連接時,如果連接之后字符串總長大于dest能容納的最大長度src函數不會停止而是將后面的連接上去,并且在連接完最后個字符之后添加上NUL
strncmp
以上三個函數的功能和我們剛剛介紹過的strcpy,strcat,strcmp的功能主要的差別就是在長度的控制上
3.字符串查找函數
查找一個字符
我們常常使用strchr和strrchr來查找字符串里某個字符的位置
strchr找到該字符第一次出現在該串中的位置,并返回指向它的指針。
strrchr找到該字符最后一次出現在該串中的位置,并返回指向它的指針。
查找任意幾個字符
strpbrk(char const *str,char const *group);
值得注意的是:如果輸入了一個任意幾個字符其中第一個字符存在于字符串里,但是后面的不存在它仍然會給你返回指向第一個字符的位置的指針~
返回原串中第一次出現的目標串的任意字符的地址
匹配任何一個字符
int main ( ) { char *arr = "ABCD"; char *ret = strpbrk( arr,"BF" ); printf( "%c\n" , *ret ); system( "pause" ); return 0 ; }
查找子串strstr(const char *str,const char *str2)
庫函數里并沒有像strrstr這樣的函數,但我們可以自己實現它!該函數也是用于在字符串里查找子串不和上面函數不一樣的是如果子串沒有完整的出現在原串里它將返回NULL
拓展:實現strrstr 出現一次截斷一次
int main ( ) { char *arr = "ABCD"; char *ret = strstr( arr,"BF" ); printf( "%c\n" , *ret ); system( "pause" ); return 0 ; }
4.高級查找字符串
查找一個字符串前綴
strspn(const char *str,const char *group);
strcspn(const char *str,const char *group);
group指定了一個或者多個字符。strspn返回str起始部分匹配group里任意字符的字符數,如果str離包含空格和制表符那么這個函數將返回str其實部分空白字符的數目
而strcspn正好與之相反的計算了不匹配的字符數目一旦出現相等的就不統計了!!
下面的代碼將計算指向第一個非空白字符的指針的值:char *ptr=buffer+strspn(buffer,"\n\r\t\v");
查找標記
找到第一個標記并將它置成NULL 保存它的位置并且下次從上次保存的位置開始找下一個標記。
提取表及
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。