這章總體來說,簡單,基本就是進一步介紹了字串、字元和位元組常用函式的使用,以及注意的事項。
9.1 字串基礎
字串就是一串零個或多個字元,並且以乙個模式為全 0 的 nul 位元組結尾。
標頭檔案 string.h 包含了使用字串函式所需的原型和宣告。
9.2 字串長度
就是它所包含的字元個數。
size_t strlen
(char
const
*string)
;
size_t 定義在 stddef.h 中,是個無符號整型。其實這個函式,之前也介紹並利用指標實現過
#include
size_t strlen
(char
const
*str)
intmain
(void
)
9.3 不受限制的字串函式
最常用的字串函式都是「不受限制」的,就是說它們只是通過尋找字串引數結尾的 nul 位元組來判斷它的長度。這些函式一般都是指定一塊記憶體用於存放結果字串,需要注意的是必須保證結果字串不會溢位這塊記憶體。
9.3.1 複製字串
char
*strcpy
(char
*dst,
char
const
*src)
;
把引數 src 字串複製到 dst 引數。由於 dst 引數將進行修改,所以它必須是個字元陣列或者乙個指向動態分配記憶體的陣列的指標。
目標引數的以前記憶體將被覆蓋並丟失,因為新的字串是以 nul 位元組結尾,並且必須保證目標字元陣列的空間足以容納需要複製的字串。
如果 src 和 dst 的位置發生重疊,結果是未定義的。
#include
#include
intmain
(void
)
9.3.2 連線字串char
*strcat
(char
*dst,
char
const
*src)
;
strcat 函式要求 dst 引數原先已經包含了乙個字串(可以是空字串)。它找到這個字串的末尾,並把 src 字串的乙份拷貝新增到這個位置。
如果 src 和 dst 的位置發生重疊,結果是未定義的。必須保證目標字元陣列的空間足以容納需要複製的字串。
9.3.3 函式的返回值
strcpy 和 strcat 都返回它們第 1 個引數的拷貝,就是乙個指向目標字元陣列的指標。
// 巢狀呼叫
strcat
(strcpy
(dst, a)
, b)
;// 和上面的效果一樣
strcpy
(dst, a)
;strcat
(dst, b)
;
9.3.4 字串比較
比較兩個字串涉及對兩個字串對於的字元逐個進行比較,知道發現不匹配為止。
/**
* s1 小於 s2 返回小於零的值
* s1 大於 s2 返回大於零的值
* 相等,返回零
*/int
strcmp
(char
const
*s1,
char
const
*s2)
;
9.4 長度受限制的字串函式char
*strncpy
(char
*dst,
char
const
*src, size_t len)
;char
*strncat
(char
*dst,
char
const
*src, size_t len)
;char
*strncmp
(char
*s1,
char
const
*s2, size_t len)
;
strncpy 中,如果 strlen(src) 的值小於 len,dst 陣列就用額外的 nul 位元組填充到 len 長度。如果 strlen(src) 大等於 len,那麼只有 len 個字元被複製到 dst 中。注意,它的結果將不會以 nul 位元組結尾,也就不是乙個字串。
9.5 字串查詢基礎
9.5.1 查詢乙個字元
char
*strchr
(char
const
*src,
int ch)
;char
*strrchr
(char
const
*src,
int ch)
;
前者是查詢字元 ch 在 src 中第一次出現位置;後者是查詢字元 ch 在 src 中最後一次出現位置。
9.5.2 查詢任何幾個字元
char
*strpbrk
(char
const
*str,
char
const
*group)
;
查詢任何一組字元第 1 次在字串**現的位置
9.5.3 查詢乙個子串
char
*strstr
(char
const
*s1,
char
const
*s2)
;
在 s1 中查詢整個 s2 第 1 次出現的起始位置,並返回乙個指向該位置的指標。
9.6 高階字串查詢
這幾個函式感覺沒啥可說的,當具體使用時,查下函式說明即可。
9.6.1 查詢乙個字串字首
size_t strspn
(char
const
*str,
char
const
*group)
;size_t strcspn
(char
const
*str,
char
const
*group)
;
9.6.2 查詢標記char
*strtok
(char
const
*str,
char
const
*sep)
;
9.7 錯誤資訊
當呼叫一些函式,請求作業系統執行一些功能如開啟檔案時,如果出現錯誤,作業系統是通過設定乙個外部的整型變數 errno 進行錯誤**報告的。strerror 函式把其中乙個錯誤**作為引數並返回乙個指向用於描述錯誤的字串指標
char
*strerror
(int error_number)
;
9.8 字元操作
標準庫包含了兩組函式,用於操作單獨的字元,它們的原型位於標頭檔案 ctype.h 。第一組函式用於對字元分類,而第二組用於對轉換字元。
9.8.1 字元分類
9.8.2 字元轉換
int
tolower
(int ch)
;int
toupper
(int ch)
;
這兩函式沒啥可講的,可具體操作下,看字面意思就曉得了。
9.9 記憶體操作
根據定義,字串由乙個 nul 位元組結尾,所以字串內部不能包含任何 nul 字元。但是,非字串資料內包含零值的情況並不罕見。無法使用字串函式來處理這種型別的資料,因為當它們遇到第乙個 nul 位元組時將停止工作。
以下函式操作與字串函式類似,但能夠處理任意位元組序列,因為它們在遇到 nul 位元組時並不會停止操作。
void
*memcpy
(void
*dst,
void
const
*src, size_t length)
;void
*memmove
(void
*dst,
void
const
*src, size_t length)
;void
*memcmp
(void
const
*a,void
const
*b, size_t length)
;void
*memchr
(void
const
*a,int ch, size_t length)
;void
*memset
(void
*a,int ch, size_t length)
;
第9章 字串 字元和位元組
c語言並沒有顯式的字串資料型別,因為字串以字串常量的形式出現或者儲存於字元陣列中。nul位元組是字串的終止符,但它本身並不是字串的一部分,所以字串的長度並不包括nul位元組。1 求字串長度 strlen 2 複製字串 strcpy 程式設計師必須保證目標字元陣列的空間足以容納需要複製的字串。如果字串...
c和指標 字串 字元 位元組
字串就是一串零個或多個字元,並且以乙個位模式為全0的nul位元組結尾 但是nul並不是字串的一部分,所以字串長度不包括nul。函式原型 size t strlen char const string 這個函式中出現了size t型別,這個型別是在stddef.h中定義的,它是乙個無符號的整型。但是在...
c和指標 字串 字元 位元組
1.strspn 返回字串中第乙個不在指定字串中出現的字元下標 表頭檔案 include定義函式 size t strspn const char s,const char accept 函式說明 strspn 從引數s 字串的開頭計算連續的字元,而這些字元都完全是accept 所指字串中的字元。簡...