跳至內容

string.h

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

string.hC標準庫的一個標頭檔,其中包含了(巨集)定義、常數以及函數和類型的聲明,涉及的內容除了字串處理之外,還包括大量的主記憶體處理常式;因此,string.h這個命名是不恰當的。

string.h中定義的函數十分常用,作為C標準庫的一部分,它們被強制要求可以在任何支援C語言的平台上執行。但是,部分函數存在一些安全隱患,例如緩衝區溢位等,導致程式設計師寧願使用一些更安全的函數而放棄一定的可移植性。同時,這些字串函數只能處理ASCII字元集或相容ASCII的字元集,如ISO-8859-1;在處理存在多位元組字元的字元集,如UTF-8時,會產生一個警告,指出對字串「長度」的計算是以位元組而不是以Unicode字元為單位。非ASCII相容字元集的字串處理常式一般位於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, char c, size_t n); 在從s開始的n個位元組內尋找c第一次出現的地址並返回,若未找到則返回NULL
int memcmp(const void *s1, const void *s2, size_t n); 對從兩個主記憶體地址開始的n個字元進行比較
void *memset(void *, int, size_t); 用某種位元組內容覆寫一段主記憶體空間
char *strcat(char *dest, const char *src); 在字串dest之後連接上src
char *strncat(char *dest, const char *src, size_t n); 從src截取n個字元連接在字串dest之後,返回dest字串
char *strchr(const char* str, int ch); 從字串str頭開始尋找字元ch首次出現的位置
char *strrchr(const char* str,int ch); 從字串str尾開始尋找字元ch首次出現的位置
int strcmp(const char *, const char *); 基於字典順序比較兩個字串
int strncmp(const char *, const char *, size_t n); 基於字典順序比較兩個字串,最多比較n個位元組
int strcoll(const char *, const char *); 基於當前區域設置字元順序英語collating order比較兩個字串
char *strcpy(char* str1, const char* str2); 將str2拷貝給str1
char *strncpy(char* str1, const char* str2, size_t n); 截取str2的n個字元拷貝給str1
char *strerror(int); 返回錯誤碼對應的解釋字串,參見errno.h(非線程安全函數)
size_t strlen(const char *); 返回一個字串的長度
size_t strspn(const char *s, const char *strCharSet); 從字串s的起始處開始,尋找第一個出現在strCharSet中的字元,返回其位置索引值。換句話說,返回從字串s的起始位置的完全由strCharSet中的字元構成的子串的最大長度。strspn為string span的縮寫。不支援多位元組字元集。
size_t strcspn(const char *s, const char *strCharSet); 從字串s的起始處開始,尋找第一個出現在strCharSet中的字元,返回其位置索引值。換句話說,返回從字串s的起始位置的完全由不屬於strCharSet中的字元構成的子串的最大長度。strcspn為string complement span的縮寫。不支援多位元組字元集。
char *strpbrk(const char *s, const char *breakset); 在字串s中尋找breakset中任意字元第一次出現的位置的指標值。strpbrk為string pointer break縮寫。通常,breakset是分隔符的集合。不支援多位元組字元集。
char *strstr(const char *haystack, const char *needle); 在字串haystack中尋找字串needle第一次出現的位置,heystack的長度必須長於needle
char *strtok(char *strToken, const char *strDelimit ); 將一個字串strToken依據分界符(delimiter)分隔成一系列字串。此函數非線程安全,且不可重入;但MSVC實現時使用了thread-local static variable因而是線程安全的但仍然是不可重入,即在單線程中不能對兩個源字串交替呼叫該函數來分析token,應當對一個字串分析完成後再處理別的字串。
size_t strxfrm(char *dest, const char *src, size_t n); 根據當前locale轉換一個字串為strcmp使用的內部格式

ISO C擴充函數

[編輯]
名稱 說明 標準
void *memccpy(void *dest, const void *src, int c, size_t n

);

在兩塊不重疊的主記憶體地址間複製內容,直至複製了n位元組或遇到內容為c的位元組 UNIX 98?
void *mempcpy(void *dest, const void *src, size_t n); memcpy的變體,返回寫入的最後一個位元組的地址指標 GNU
errno_t strcat_s(char *s1, size_t s1max, const char *s2); strcat的變體,帶邊界檢查 ISO/IEC WDTR 24731
errno_t strcpy_s(char *s1, size_t s1max, const char *s2); strcpy的變體,帶邊界檢查 ISO/IEC WDTR 24731
char *strdup(const char *); 將字串的內容複製到一段新分配的主記憶體空間 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,現在也可以在FreeBSDSolarisMac OS X中找到
size_t strlcpy(char *dest, const char *src, size_t n); strcpy的變體,帶邊界檢查 首先定義於OpenBSD,現在也可以在FreeBSDSolarisMac OS X中找到
char *strsignal(int sig); strerror類似,返回有符號數sig對應的錯誤解釋字串(非線程安全函數) BSDs, Solaris, Linux
char *strtok_r(char *, const char *, char **); strtok的線程安全且可重入的版本 POSIX

外部連結

[編輯]