天天看點

C标準庫<string.h>實作

<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使用的内部格式

函數原型代碼如下:

C标準庫&lt;string.h&gt;實作

1、void *memcpy(void *dest, const void *src, size_t n);

功能:從源src所指的記憶體位址的起始位置開始拷貝n個位元組到目标dest所指的記憶體位址的起始位置中

傳回:函數傳回指向dest的指針

C标準庫&lt;string.h&gt;實作

2、void *memmove( void* dest, const void* src, size_t count );

功能:由src所指記憶體區域複制count個位元組到dest所指記憶體區域

C标準庫&lt;string.h&gt;實作

3、void *memchr(const void *buf, int ch, size_t count);

功能:從buf所指記憶體區域的前count個位元組查找字元ch

傳回:當第一次遇到字元ch時停止查找。如果成功,傳回指向字元ch的指針;否則傳回null

C标準庫&lt;string.h&gt;實作

4、int memcmp(const void *buf1, const void *buf2, unsigned int count);

功能:比較記憶體區域buf1和buf2的前count個位元組

傳回:

當buf1&lt;buf2時,傳回值&lt;0

當buf1=buf2時,傳回值=0

當buf1&gt;buf2時,傳回值&gt;0

C标準庫&lt;string.h&gt;實作

5、void *memset(void *s, int ch, size_t n);

功能:将s中前n個位元組用 ch 替換并傳回 s 在一段記憶體塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法

傳回:指向s的指針

C标準庫&lt;string.h&gt;實作

6、char *strcat(char *dest,char *src);

功能:把src所指字元串添加到dest結尾處(覆寫dest結尾處的'\0')并添加'\0'。

C标準庫&lt;string.h&gt;實作

7、char *strncat(char * s1,const char * s2.size_t n);

功能:把src所指字元串的前n個字元添加接功能到dest結尾處(覆寫dest結尾處接功能的'\0')并添加'\0'。

C标準庫&lt;string.h&gt;實作

8、char *strchr(const char *s,char c);

功能:查找字元串s中首次出現字元c的位置

C标準庫&lt;string.h&gt;實作

9、char *strrchr(const char *s, int c)

功能:查找一個字元c在另一個字元串str中末次出現的位置(也就是從str的右側開始查找字元c首次出現的位置),并傳回從字元串中的這個位置起,一直到字元串結束的所有字元。如果未能找到指定字元,那麼函數将傳回null。

C标準庫&lt;string.h&gt;實作

10、int strcmp(const char *s1,const char * s2);

功能:比較兩個字元串。設這兩個字元串為str1,str2,若str1=str2,則傳回零;若str1&gt;str2,則傳回正數;若str1&lt;str2,則傳回負數。

C标準庫&lt;string.h&gt;實作

11、int strncmp(char *str1, char *str2, int maxlen);

功能:這個函數用來比較s1和s2字元串,這個函數将傳回一個值, 它的符号與第一對不同的字元的比較結果相關。

如果兩個字元串相等的話,strncmp将傳回0。

如果s1是s2的一個子串的話,s1小于s2。此函數與strcmp極為類似。不同之處是,strncmp函數是指定比較size個字元。也就是說,如果

字元串s1與s2的前size個字元相同,函數傳回值為0。

C标準庫&lt;string.h&gt;實作

12、int strcoll(const char *s1,const char * s2); 

功能:根據lc_collate比較字元串s1和s2

C标準庫&lt;string.h&gt;實作

13、char *strcpy(char* dest, const char *src);

功能:把從src位址開始且含有null結束符的字元串複制到以dest開始的位址空間

說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字元串。傳回指向dest的指針。

C标準庫&lt;string.h&gt;實作

14、char *strncpy(char *_s1, const char *_s2, size_t _n);

功能:(c/c++)複制字元串src中的内容(字元,數字、漢字....)到字元串dest中,複制多少由size_t的值決定,傳回指向dest的指針。如果遇到空字元('\0'),則空字元後面全部為空(字元)

C标準庫&lt;string.h&gt;實作

15、char *strerror(int errnum)

功能:通過标準錯誤的标号,獲得錯誤的描述字元串。

C标準庫&lt;string.h&gt;實作

16、size_t strlen(const char *org)

功能:計算字元串s的(unsigned int型)長度,不包括'\0'在内

說明:傳回s的長度,不包括結束符null

C标準庫&lt;string.h&gt;實作

17、size_t strspn (const char *s,const char * accept);

功能:strspn()從參數s 字元串的開頭計算連續的字元,而這些字元都完全是accept 所指字元串中的字元。簡單的說,若strspn()傳回的數值為n,則代表字元串s 開頭連續有n 個字元都是屬于字元串accept内的字元

C标準庫&lt;string.h&gt;實作

18、size_t strcspn(const char *string, const char *notin)

功能:順序在字元串s1中搜尋與s2中字元的第一個相同字元,傳回這個字元在s1中第一次出現的位置

C标準庫&lt;string.h&gt;實作

19、char *strpbrk(const char *s1, const char *s2);

功能:依次檢驗字元串s1中的字元,當被檢驗字元在字元串s2中也包含時,則停止檢驗,并傳回該字元位置,空字元null不包括在内

C标準庫&lt;string.h&gt;實作

20、char *strstr(const char *str1, const char *str2);

功能:傳回str2第一次在str1中的位置,如果沒有找到,傳回null

C标準庫&lt;string.h&gt;實作

21、char *strtok(char *string, const char *separators)

功能:分解字元串為一組字元串。s為要分解的字元串,delim為分隔符字元串。

C标準庫&lt;string.h&gt;實作

22、size_t strxfrm(char *s1, const char *save, size_t n)

功能:根據num長度拷貝前num個字元到目的字元串中,并傳回源字元串長度。同時,該函數還可以自作為傳回字元串長度,這時num=0,destination允許傳入null

C标準庫&lt;string.h&gt;實作

繼續閱讀