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

外部連結