跳到內容

C 程式設計/string.h

來自華夏公益教科書,自由的教科書

string.h 是 C 標準庫中用於 C 程式語言的標標頭檔案,它包含宏定義、常量以及函式和型別宣告,不僅用於字串處理,還用於各種記憶體處理函式;因此,這個名字有點誤導性。

string.h 中宣告的函式非常流行,因為作為 C 標準庫的一部分,它們保證在支援 C 的任何平臺上都能正常工作。但是,這些函式存在一些安全問題,例如緩衝區溢位,導致程式設計師更喜歡更安全的、可能不太可移植的變體。此外,字串函式僅適用於由位元組組成的字元編碼,例如 ASCII 和 UTF-8。在歷史文獻中,術語“字元”經常用於代替“位元組”,如果按字面意思理解,則意味著不支援多位元組編碼,例如 UTF-8。BSD 文件已修復以明確這一點,但 POSIX、Linux 和 Windows 文件在許多地方仍然使用“字元”。用於處理由大於位元組的程式碼單元組成的字元編碼的函式,例如 UTF-16,通常是透過 wchar.h 實現的。

常量和型別

[編輯 | 編輯原始碼]
名稱 備註
NULL 展開為空指標常量的宏;也就是說,一個表示指標值的常量,該值保證**不是**記憶體中物件的有效地址。
size_t 一種無符號整型型別,它是 sizeof 運算子結果的型別。
名稱 備註
void *memcpy(void *dest, const void *src, size_t n); 在兩個記憶體區域之間複製 n 個位元組;如果有重疊,行為未定義
void *memmove(void *dest, const void *src, size_t n); 在兩個記憶體區域之間複製 n 個位元組;與 memcpy 不同的是,這些區域可能重疊
void *memchr(const void *s, int c, size_t n); 返回指向 s 的前 n 個位元組中第一個出現的 c 的指標,如果未找到則返回 NULL
int memcmp(const void *s1, const void *s2, size_t n); 比較兩個記憶體區域的前 n 個位元組
void *memset(void *, int c, size_t n); 用 n 個 c 的副本覆蓋一個記憶體區域
char *strcat(char *dest, const char *src); 將字串 src 附加到 dest
char *strncat(char *dest, const char *src, size_t n); 將字串 src 的最多 n 個位元組附加到 dest
char *strchr(const char *, int c); 從開頭開始查詢字串中的位元組 c
char *strrchr(const char *, int c); 從結尾開始查詢字串中的位元組 c
int strcmp(const char *, const char *); 按字典順序比較兩個字串
int strncmp(const char *, const char *, size_t n); 按字典順序比較兩個字串的前 n 個位元組
int strcoll(const char *, const char *); 使用當前區域設定的排序順序比較兩個字串
char *strcpy(char *dest, const char *src); 將字串從一個位置複製到另一個位置
char *strncpy(char *dest, const char *src, size_t n); 將恰好 n 個位元組寫入 dest,從 src 複製或新增 0
char *strerror(int); 返回錯誤號的字串表示,例如 errno(非執行緒安全)
size_t strlen(const char *); 查詢 C 字串的長度
size_t strspn(const char *, const char *accept); 確定完全由 accept 中的位元組組成的最大初始子字串的長度
size_t strcspn(const char *, const char *reject); 確定完全由不在 reject 中的位元組組成的最大初始子字串的長度
char *strpbrk(const char *, const char *accept); 查詢 accept 中任何位元組的第一個出現
char *strstr(const char *haystack, const char *needle); 查詢更長字串“haystack”中字串“needle”的第一個出現
char *strtok(char *, const char * delim); 將字串解析為一系列標記;在規範中是非執行緒安全的,不可重入[1]
size_t strxfrm(char *dest, const char *src, size_t n); 將 src 轉換為排序形式,以便轉換後字串的數字排序順序等同於 src 的排序順序

ISO C 的擴充套件

[編輯 | 編輯原始碼]
名稱 備註 規範
void *memccpy(void *dest, const void *src, int c, size_t n); 在兩個記憶體區域之間複製最多 n 個位元組,這些區域不能重疊,當找到位元組 c 時停止 SVID、POSIX[2]
void *mempcpy(void *dest, const void *src, size_t n); memcpy 的變體,返回指向最後一個寫入位元組之後的位元組的指標 GNU
errno_t strcat_s(char *dest, size_t n, const char *src); strcat 的邊界檢查變體 ISO/IEC WDTR 24731
errno_t strcpy_s(char *dest, size_t n, const char *src); strcpy 的邊界檢查變體 ISO/IEC WDTR 24731
char *strdup(const char *src); 在記憶體中分配並複製一個字串 POSIX;最初是 BSD 擴充套件
int strerror_r(int, char *, size_t); 以執行緒安全的方式將 strerror() 的結果放入提供的緩衝區中。 POSIX:2001
char *strerror_r(int, char *, size_t); 以執行緒安全的方式返回 strerror()。提供的緩衝區僅在必要時使用(與 POSIX 版本不相容)。 GNU
size_t strlcat(char *dest, const char *src, size_t n); strcat 的邊界檢查變體 最初是 OpenBSD,現在也是 FreeBSD、Solaris、Mac OS X
size_t strlcpy(char *dest, const char *src, size_t n); strcpy 的邊界檢查變體 最初是 OpenBSD,現在也是 FreeBSD、Solaris、Mac OS X
char *strsignal(int sig); strerror 相似,返回訊號 sig 的字串表示(非執行緒安全) POSIX:2008[3]
char *strtok_r(char *, const char *delim, char **saveptr); strtok 的執行緒安全且可重入版本[1] POSIX

參考文獻

[編輯 | 編輯原始碼]
[編輯 | 編輯原始碼]
華夏公益教科書