<string.h>中聲明的函數是對标準c的一個重要補充,它們支援c語言把文本作為字元數組操作的傳統。
string.h是c語言中c标準庫的頭檔案,其中包含了宏定義、常量以及函數和類型的聲明,涉及的内容除了字元串處理之外,還包括大量的記憶體處理函數;是以,<code>string.h</code>這個命名是不恰當的。在<code>string.h</code>中定義的函數十分常用,作為c标準庫的一部分,它們被強制要求可以在任何支援c語言的平台上運作。但是,部分函數存在一些安全隐患,
例如緩存溢出等,導緻程式員甯願使用一些更安全的函數而放棄一定的可移植性。同時,這些字元串函數隻能處理ascii字元集或相容ascii的字元集,如
iso-8859-1;在處理存在多位元組字元的字元集,如utf-8時,會産生一個警告,指出對字元串“長度”的計算是以位元組而不是以unicode字元
為機關。非ascii相容字元集的字元串處理函數一般位于<code>wchar.h</code>中。
c标準庫提供了所有重要的功能。這些函數可以對一下3種形式的串進行操作:
名字以mem開頭的函數對任意的字元序列進行操作
名字以strn開頭的函數對非空字元序列進行操作
所有其他名字以str開頭的函數對空字元結尾的字元序列進行操作
名稱
說明
<code>null</code>
表示空指針常量的宏,即表示一個不指向任何有效記憶體單元位址的指針常量。
<code>size_t</code>
無符号整型,被用于<code>sizeof</code>運算符的傳回值類型。
代碼如下:
<code>void *memcpy(void *dest, const void *src, size_t n);</code>
将n位元組長的内容從一個記憶體位址複制到另一個位址;如果兩個位址存在重疊,則最終行為未定義
<code>void *memmove(void *dest, const void *src, size_t n);</code>
将n位元組長的内容從一個記憶體位址複制到另一個位址;與<code>memcpy</code>不同的是它可以正确作用于兩個存在重疊的位址
<code>void *memchr(const void *s, char c, size_t n);</code>
在從s開始的n個位元組内查找c第一次出現的位址并傳回,若未找到則傳回null
<code>int memcmp(const void *s1, const void *s2, size_t n);</code>
對從兩個記憶體位址開始的n個字元進行比較
<code>void *memset(void *, int, size_t);</code>
用某種位元組内容覆寫一段記憶體空間
<code>char *strcat(char *dest, const char *src);</code>
在字元串dest之後連接配接上src
<code>char *strncat(char *dest, const char *src, size_t n);</code>
在字元串dest之後連接配接上src,最多增加n個字元
<code>char *strchr(const char *, int);</code>
從字元串頭開始查找某字元出現的位置
<code>char *strrchr(const char *, int);</code>
從字元串尾開始查找某字元出現的位置
<code>int strcmp(const char *, const char *);</code>
基于字典順序比較兩個字元串
<code>int strncmp(const char *, const char *, size_t);</code>
基于字典順序比較兩個字元串,最多比較n個位元組
<code>int strcoll(const char *, const char *);</code>
基于目前區域設定的字元順序比較兩個字元串
<code>char *strcpy(char *tohere, const char *fromhere);</code>
将一個字元串從一個位置複制到另一個位置
<code>char *strncpy(char *tohere, const char *fromhere, size_t);</code>
将一個字元串從一個位置複制到另一個位置,最多複制n個位元組
<code>char *strerror(int);</code>
傳回錯誤碼對應的解釋字元串,參見errno.h(非線程安全函數)
<code>size_t strlen(const char *);</code>
傳回一個字元串的長度
<code>size_t strspn(const char *s, const char *strcharset);</code>
從字元串s的起始處開始,尋找第一個不出現在strcharset中的字元,傳回其位置索引值
<code>size_t strcspn(const char *s, const char *strcharset);</code>
從字元串s的起始處開始,尋找第一個出現在strcharset中的字元,傳回其位置索引值
<code>char *strpbrk(const char *s, const char *strcharset);</code>
在字元串s中查找strcharset中任意字元第一次出現的位置的指針值
<code>char *strstr(const char *haystack, const char *needle);</code>
在字元串haystack中查找字元串needle第一次出現的位置,heystack的長度必須長于needle
<code>char *strtok(char *, const char *);</code>
将一個字元串分隔成一系列字元串;此函數非線程安全,且不可重入
<code>size_t strxfrm(char *dest, const char *src, size_t n);</code>
根據目前locale轉換一個字元串為strcmp使用的内部格式
函數原型代碼如下:
1、void *memcpy(void *dest, const void *src, size_t n);
功能:從源src所指的記憶體位址的起始位置開始拷貝n個位元組到目标dest所指的記憶體位址的起始位置中
傳回:函數傳回指向dest的指針
2、void *memmove( void* dest, const void* src, size_t count );
功能:由src所指記憶體區域複制count個位元組到dest所指記憶體區域
3、void *memchr(const void *buf, int ch, size_t count);
功能:從buf所指記憶體區域的前count個位元組查找字元ch
傳回:當第一次遇到字元ch時停止查找。如果成功,傳回指向字元ch的指針;否則傳回null
4、int memcmp(const void *buf1, const void *buf2, unsigned int count);
功能:比較記憶體區域buf1和buf2的前count個位元組
傳回:
當buf1<buf2時,傳回值<0
當buf1=buf2時,傳回值=0
當buf1>buf2時,傳回值>0
5、void *memset(void *s, int ch, size_t n);
功能:将s中前n個位元組用 ch 替換并傳回 s 在一段記憶體塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法
傳回:指向s的指針
6、char *strcat(char *dest,char *src);
功能:把src所指字元串添加到dest結尾處(覆寫dest結尾處的'\0')并添加'\0'。
7、char *strncat(char * s1,const char * s2.size_t n);
功能:把src所指字元串的前n個字元添加接功能到dest結尾處(覆寫dest結尾處接功能的'\0')并添加'\0'。
8、char *strchr(const char *s,char c);
功能:查找字元串s中首次出現字元c的位置
9、char *strrchr(const char *s, int c)
功能:查找一個字元c在另一個字元串str中末次出現的位置(也就是從str的右側開始查找字元c首次出現的位置),并傳回從字元串中的這個位置起,一直到字元串結束的所有字元。如果未能找到指定字元,那麼函數将傳回null。
10、int strcmp(const char *s1,const char * s2);
功能:比較兩個字元串。設這兩個字元串為str1,str2,若str1=str2,則傳回零;若str1>str2,則傳回正數;若str1<str2,則傳回負數。
11、int strncmp(char *str1, char *str2, int maxlen);
功能:這個函數用來比較s1和s2字元串,這個函數将傳回一個值, 它的符号與第一對不同的字元的比較結果相關。
如果兩個字元串相等的話,strncmp将傳回0。
如果s1是s2的一個子串的話,s1小于s2。此函數與strcmp極為類似。不同之處是,strncmp函數是指定比較size個字元。也就是說,如果
字元串s1與s2的前size個字元相同,函數傳回值為0。
12、int strcoll(const char *s1,const char * s2);
功能:根據lc_collate比較字元串s1和s2
13、char *strcpy(char* dest, const char *src);
功能:把從src位址開始且含有null結束符的字元串複制到以dest開始的位址空間
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字元串。傳回指向dest的指針。
14、char *strncpy(char *_s1, const char *_s2, size_t _n);
功能:(c/c++)複制字元串src中的内容(字元,數字、漢字....)到字元串dest中,複制多少由size_t的值決定,傳回指向dest的指針。如果遇到空字元('\0'),則空字元後面全部為空(字元)
15、char *strerror(int errnum)
功能:通過标準錯誤的标号,獲得錯誤的描述字元串。
16、size_t strlen(const char *org)
功能:計算字元串s的(unsigned int型)長度,不包括'\0'在内
說明:傳回s的長度,不包括結束符null
17、size_t strspn (const char *s,const char * accept);
功能:strspn()從參數s 字元串的開頭計算連續的字元,而這些字元都完全是accept 所指字元串中的字元。簡單的說,若strspn()傳回的數值為n,則代表字元串s 開頭連續有n 個字元都是屬于字元串accept内的字元
18、size_t strcspn(const char *string, const char *notin)
功能:順序在字元串s1中搜尋與s2中字元的第一個相同字元,傳回這個字元在s1中第一次出現的位置
19、char *strpbrk(const char *s1, const char *s2);
功能:依次檢驗字元串s1中的字元,當被檢驗字元在字元串s2中也包含時,則停止檢驗,并傳回該字元位置,空字元null不包括在内
20、char *strstr(const char *str1, const char *str2);
功能:傳回str2第一次在str1中的位置,如果沒有找到,傳回null
21、char *strtok(char *string, const char *separators)
功能:分解字元串為一組字元串。s為要分解的字元串,delim為分隔符字元串。
22、size_t strxfrm(char *s1, const char *save, size_t n)
功能:根據num長度拷貝前num個字元到目的字元串中,并傳回源字元串長度。同時,該函數還可以自作為傳回字元串長度,這時num=0,destination允許傳入null