String.h

`'''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