string.h
是C標準庫的一個標頭檔,其中包含了宏(巨集)定義、常數以及函數和類型的聲明,涉及的內容除了字串處理之外,還包括大量的主記憶體處理常式;因此,string.h
這個命名是不恰當的。
此條目沒有列出任何參考或來源。 (2020年4月27日) |
在string.h
中定義的函數十分常用,作為C標準庫的一部分,它們被強制要求可以在任何支援C語言的平台上執行。但是,部分函數存在一些安全隱患,例如緩衝區溢位等,導致程式設計師寧願使用一些更安全的函數而放棄一定的可移植性。同時,這些字串函數只能處理ASCII字元集或相容ASCII的字元集,如ISO-8859-1;在處理存在多位元組字元的字元集,如UTF-8時,會產生一個警告,指出對字串「長度」的計算是以位元組而不是以Unicode字元為單位。非ASCII相容字元集的字串處理常式一般位於wchar.h
中。
常數和類型
函數
名稱 | 說明 |
---|---|
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使用的內部格式 |
名稱 | 說明 | 標準 |
---|---|---|
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 |
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.