不要懷疑,博主此次真的是在挖墳,今天整理筆記的時候纔看見,因此呢,就上來備份一下,這篇呢主要是說一些關於字符串函數的知識點,但願你們之後在使用的時候注意一下!
數組
1、字符串基本知識
1.字符串:顧名思義,字符串即一串字符的組合,而且以NUL結尾,因此咱們不能讓'\0'出如今字符串還 沒有結束的地方。
2.NUL:它自己並非字符串的一部分而是一個咱們用來判斷一個字符串結束與否的標識!
3.字符串的分類:常量字符串,字符串數組。安全
常量字符串ide
通常來講咱們使用常量字符串來保存那些不須要被修改的字符串函數
字符串數組spa
存放在數組裏的字符串咱們能夠對其進行增刪和替換
注意:若咱們要使用字符串函數必須引頭文件string.h
2、串操做函數
一、字符串的長度度量標尺: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的後面!string
字符鏈接函數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 保存它的位置而且下次從上次保存的位置開始找下一個標記。
提取表及