char *strchr(const char *s, int c);
它表示在字串 s 中查詢字元 c,返回字元 c 第一次在字串 s 中出現的位置,如果未找到字元 c,則返回 NULL。也就是說,strchr 函數在字串 s 中從前到後(或者稱為從左到右)查詢字元 c,找到字元 c 第一次出現的位置就返回,返回值指向這個位置,如果找不到字元 c 就返回 NULL。char *strrchr(const char *s, int c);
與 strchr 函數一樣,它同樣表示在字串 s 中查詢字元 c,返回字元 c 第一次在字串 s 中出現的位置,如果未找到字元 c,則返回 NULL。但兩者唯一不同的是,strrchr 函數在字串 s 中是從後到前(或者稱為從右向左)查詢字元 c,找到字元 c 第一次出現的位置就返回,返回值指向這個位置。下面的範例程式碼演示了兩者之間的區別:int main(void) { char str[] = "I welcome any ideas from readers, of course."; char *lc = strchr(str, 'o'); printf("strchr: %sn", lc); char *rc = strrchr(str, 'o'); printf("strrchr: %sn", rc); return 0; }對於上面的範例程式碼,strchr 函數是按照從前到後的順序進行查詢,所以得到的結果為“ome any ideas from readers,of course.”; 而 strrchr 函數則相反,它按照從後到前的順序進行查詢,所以得到的結果為“ourse.”。
char *strpbrk(const char *s1,const char *s2);
例如,在 strpbrk 函數的定義如下:char *strpbrk (const char *s, const char *accept) { while (*s != '') { const char *a = accept; while (*a != '') if (*a++ == *s) return (char *) s; ++s; } return NULL; }如上面的程式碼所示,strpbrk 數首先依次迴圈檢查字串 s 中的字元,當被檢驗的字元在字串 accept 中也包含時(即“if(*a++==*s)”),則停止檢驗,並返回“(char*)s”。如果沒有匹配字元,則返回空指標 NULL。這裡需要注意的是,空字元 null('')不包括在內。函數的呼叫範例如下面的程式碼所示:
int main(void) { char str[] = "I welcome any ideas from readers, of course."; char *rc=strpbrk(str,"come"); printf("%sn",rc); return 0; }很顯然,範例程式碼的執行結果為“elcome any ideas from readers,of course.”。
char *strstr(const char *haystack, const char *needle);
strstr 函數的呼叫範例如下面的程式碼所示:int main(void) { char str[] = "I welcome any ideas from readers, of course."; char *c1=strstr(str, "come"); printf("come:%sn",c1); char *c2=strstr(str, "icome"); printf("icome:%sn",c2); return 0; }這裡需要注意的是,因為 strstr 函數與 strpbrk 函數不同,strstr 函數匹配的是字串,所以語句“strstr(str,"icome")”將返回 NULL。執行結果為:
size_t strspn(const char *s, const char *accept);
例如,該函數的定義如下:size_t strspn (const char *s,const char *accept) { const char *p; const char *a; size_t count = 0; for (p = s; *p != ''; ++p) { for (a = accept; *a != ''; ++a) if (*p == *a) break; if (*a == '') return count; else ++count; } return count; }從上面的範例程式碼中可以看出,strspn 函數從字串引數 s 的開頭計算連續的字元,而這些字元完全是 accept 所指字串中的字元。簡單地說,如果 strspn 函數返回的數值為 n,則代表字串 s 開頭連續有 n 個字元都屬於字串 accept 內的字元。
int main(void) { char str[] = "I welcome any ideas from readers, of course."; printf("I wel:%dn",strspn(str,"I wel")); printf("Iwel:%dn",strspn(str,"Iwel")); printf("welcome:%dn",strspn(str,"welcome")); printf("5:%dn",strspn(str,"5")); return 0; }在上面的範例程式碼中,因為 strspn 函數返回的是以字串 s 開頭連續包含字串 accept 內的字元數目。而源字串 str 中的“I”與“welcome”之間有一個空格(即“I welcome”),所以,語句“strspn(str,"Iwel")”將返回 1,而語句“strspn(str,"I wel")”將返回 5。因此,輸出結果為:
size_t strcspn(const char *s, const char *reject);
該函數的定義如下:size_t strcspn (const char *s,const char *reject) { size_t count = 0; while (*s != '') if (strchr (reject, *s++) == NULL) ++count; else return count; return count; }從上面的程式碼中不難發現,strcspn 函數正好與 strspn 函數相反。strcspn 函數從字串引數 s 的開頭計算連續的字元,而這些字元都完全不在引數 reject 所指的字串中。簡單地說,如果 strcspn 函數返回的數值為 n,則代表字串 s 開頭連續有 n 個字元都不包含字串 reject 內的字元。
int main(void) { char str[] = "I welcome any ideas from readers, of course."; printf("I wel:%dn",strcspn(str,"I wel")); printf("Iwel:%dn",strcspn(str,"Iwel")); printf("welcome:%dn",strcspn(str,"welcome")); printf("5:%dn",strcspn(str,"5")); return 0; }在上面的範例程式碼中,因為 strcspn 函數返回的是以字串 s 開頭連續不包含字串 accept 內的字元數目。因此,其執行結果為: