1. 程式人生 > ><C和指針---讀書筆記11>

<C和指針---讀書筆記11>

con 針對 返回 正常的 字節 查找 spa 讀書 mage

對於構成字符串的,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>