<C和指針---讀書筆記11>
對於構成字符串的,string.h封裝了許多現成的函數以供使用。
字符串,不論是常量字符串還是借用數組尾綴’\0’。 這個strings.h裏面的函數都是針對的字符串。 即以’\0’做為截至。
如果你不幸的對 char數組操作,可能得到的結果並不是你想要的結果。
strlen函數 unsigned int strlen (char const *string)
參數列表: 是一個指針或者數組名即可。
返回值: 返回一個無符號數。 如果兩個返回值進行比較大小,可以使用 strlen( str1) < strlen(str2) ,
但是 strlen( str1) - strlen(str2) >0 就不行。因為兩個無符號數減法結果依舊是一個無符號數。無符號數必然大於0的。
可以使用(int) 強制轉換成 有符號int型。
用途: 計算字符串長度的。它和sizeof(字符串)的區別在於。Sizeof是計算所占的存儲位置bytes數目,因此會把’\0’算進來。
而strlen 只計算有效的字符數目。所以該值是真正的char數目。 Sizeof 是真正所占存儲的數目。
Strcpy 函數 char *strcpy (char *dst , char const *src)
參數列表 : 前面是目的地,後面是源
返回值 : 返回一個dst的值,但很多情況下不使用,只使用strcp完成對存儲的copy動作。
用途: 將源字符串,拷貝到目的字符串中。
源長度 > 目的地 : dst的內容全部被覆蓋了, ‘\0’也被覆蓋。並繼續覆蓋後面的內容。導致其他的變量被修改,這是極其危險的。
源長度 = 目的地 : 正好
源長度 < 目的地 : dst只有前面的內容被修改。 包括’\0’替換掉str[3]. 它會影響strlen(str3).因為它提前遇到了’\0’
但不影響sizeof,因為在聲明str3數組時候,編譯器已經記錄下來它對應的長度信息。無論如何都改不掉了。
Strcat函數 char *strcat (char *dst , char const *src)
參數列表 : 前面是目的地,後面是源
返回值 : 返回一個dst的值,但很多情況下不使用,只使用strcat完成對存儲的銜接動作。
用途: 將源字符串,粘連到目的地的後面。
顯然需要特別註意目的地剩余的空間是否能容下源? 能否容下’\0’ ?
源是緊接著最後一個char還是緊接著’\0’ ?
事例中把str1 粘連到str3後面,可以看出是從最後一個 有效char 開始的。 並且把str1的’\0’ cat進來了。
Strcmp函數 int strcmp (char const *s1, char const *s2)
參數列表 : 兩個帶比較的字符串
返回值 : 返回比較結果。若相等返回 0. 若1>2,返回 一個大於0的值 ;若1<2,返回 一個小於0的值
用途: 直接比較 s1和s2的char。
Strncpy 函數 char *strcpy (char *dst , char const *src ,unsigned int len)
參數列表 : 前面是目的地,後面是源,並跟一個長度信息。
返回值 : 返回一個dst的值,但很多情況下不使用,只使用strcp完成對存儲的copy動作。
用途: 將源字符串,拷貝到目的字符串中。
Len是指從 src截取長度? 還是 dst的修改長度?這個是很關鍵的對理解。Len表示修改dst的長度。
所以,如果strlen(src ) < len 。 把src復制過去,同時長度不足的部分,會用’\0’替代,用於修改dst。
如果strlen(src ) >=len , 就只復制len長度。
當然這裏我們沒有考慮 dst是否有足夠空間容納。
Strncat函數 char *strncat (char *dst , char const *src ,unsigned int len)
參數列表 : 前面是目的地,後面是源,緊跟一個長度信息
返回值 : 返回一個dst的值,但很多情況下不使用,只使用strncat完成對存儲的銜接動作。
用途: 將源字符串,粘連到目的地的後面。
更加詳細的描述是 : 不管dst空間是否足夠容納,在最後一個有效char之後,緊接著一股腦粘連len長度信息。並再額外粘一個 ‘\0’
所以不論len長度 與strlen(src)關系,都粘連len+’\0’。 不夠就用’\0’補。
Strncmp函數 int strncmp (char const *s1, char const *s2,unsigned int len)
參數列表 : 兩個帶比較的字符串,只比較len長度
返回值 : 返回比較結果。若相等返回 0. 若1>2,返回 一個大於0的值 ;若1<2,返回 一個小於0的值
用途: 直接比較 s1和s2的char。
///////////////////////////////////////////////////////////////////////
字符串查找函數。分成幾種,簡單的查找char字符、查找”a|b|c” 、查找”xxx”字符串。
高級查找如:查前綴、查分隔符等。
簡單查找---------查找一個字符串:
char *strchr ( char const *str,int ch)
參數列表 : 數組str,以及待查找的字符
返回值 : 返回一個指針,指向第一次出現的 位置。
用途:查找時候有ch字符,若有就返回一個指針,指向第一次出現的位置。若沒有就返回一個NULL指針。
char *strrchr ( char const *str,int ch)
用途:查找時候有ch字符,若有就返回一個指針,指向最後一次出現的位置。若沒有就返回一個NULL指針
查找"a|b|c"任意一個字符。
char *strpbrk ( char const *str,char const *group)
用途:查找時候有字符集合,若任意一個存在就返回一個指針,指向第一次出現的位置。若沒有就返回一個NULL指針
查找"abc"字符
char *strstr ( char const *str,char const *s)
用途:查找時候有字符集合,若整體存在就返回一個指針,指向第一次出現的位置。若沒有就返回一個NULL指針
高級查找 ----- 需要用到char高級查找時候,再來仔細研究。
字符判斷 & 字符轉換: 封裝函數在於 ctype.h 頭文件裏面。
isdigit : isdigit ( char) ,如果是0-9,就返回真。
isalpha: isalpha( char) ,如果是a-z,A-Z,就返回真。
等等,還有其他的。
字符轉換 : int toupper ( char) : 把小寫字母轉成大寫。 返回大寫形式
int tolower ( char) : 把大寫字母轉成小寫。 返回小寫形式
////////////////////////////////////////////////////////////////////////////////////////////////
內存操作
上面所介紹的字符串函數,函數內部都會自動的去判斷‘\0‘,並以此作為結束標誌。這樣,這些函數就不能用於數組。
因為數組裏面存在‘\0‘是很正常的。
C定義了另外一套函數,可以去直接操作內存。
void *memcpy(void *dst, void *const src ,unsigned int length)
memmove,memcmp、memchr、memset
簡單介紹下: memcpy 中len是字節數目。 即cpty多少字節。 因此如果字符裏面是整數型,就要註意 len *4要。
memmove: 跟memcpy類似。允許地址重疊。
memcmp: 也是比較
memchr:尋找第一次出現的位置,返回一個指針指向它
memset: 修改前n個字符,全部改成目標值。
<C和指針---讀書筆記11>