string.h
此條目沒有列出任何參考或來源。 (2020年4月27日) |
string.h
是C標準庫的一個頭文件,其中包含了宏(巨集)定義、常量以及函數和類型的聲明,涉及的內容除了字符串處理之外,還包括大量的內存處理函數;因此,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 *);
|
基於當前區域設置的字符順序比較兩個字符串 |
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,現在也可以在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 對應的錯誤解釋字符串(非線程安全函數)
|
BSDs, Solaris, Linux |
char *strtok_r(char *, const char *, char **);
|
strtok的線程安全且可重入的版本 | POSIX |