標題: 專題二:1、C語言字符處理獲取指定字符串 [打印本頁] 作者: 吻等離子 時間: 2022-3-10 13:16 標題: 專題二:1、C語言字符處理獲取指定字符串 在對 C 語言的編程實踐中,字符串查找是最頻繁的字符串操作之一,本節就對常用的字符串查找函數做一個簡單的總結。
使用 strchr 與 strrchr 函數查找單個字符如果需要對字符串中的單個字符進行查找,那么應該使用 strchr 或 strrchr 函數。其中,strchr 函數原型的一般格式如下:
char *strchr(const char *s, int c);
它表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出現的位置,如果未找到字符 c,則返回 NULL。也就是說,strchr 函數在字符串 s 中從前到后(或者稱為從左到右)查找字符 c,找到字符 c 第一次出現的位置就返回,返回值指向這個位置,如果找不到字符 c 就返回 NULL。
相對于 strchr 函數,strrchr 函數原型的一般格式如下:
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: %s\n", lc);
char *rc = strrchr(str, 'o');
printf("strrchr: %s\n", rc);
return 0;
}
對于上面的示例代碼,strchr 函數是按照從前到后的順序進行查找,所以得到的結果為“ome any ideas from readers,of course.”; 而 strrchr 函數則相反,它按照從后到前的順序進行查找,所以得到的結果為“ourse.”。
示例代碼運行結果為:
strchr: ome any ideas from readers, of course.
strrchr: ourse.
int main(void)
{
char str[] = "I welcome any ideas from readers, of course.";
char *c1=strstr(str, "come");
printf("come:%s\n",c1);
char *c2=strstr(str, "icome");
printf("icome:%s\n",c2);
return 0;
}
這里需要注意的是,因為 strstr 函數與 strpbrk 函數不同,strstr 函數匹配的是字符串,所以語句“strstr(str,"icome")”將返回 NULL。運行結果為:
come:come any ideas from readers, of course.
icome:(null)
區別 strspn 與 strcspn 函數strspn 函數表示從字符串 s 的第一個字符開始,逐個檢查字符與字符串 accept 中的字符是否不相同,如果不相同,則停止檢查,并返回以字符串 s 開頭連續包含字符串 accept 內的字符數目。其函數原型的一般格式如下:
size_t strspn(const char *s, const char *accept);
例如,該函數的定義如下:
從上面的示例代碼中可以看出,strspn 函數從字符串參數 s 的開頭計算連續的字符,而這些字符完全是 accept 所指字符串中的字符。簡單地說,如果 strspn 函數返回的數值為 n,則代表字符串 s 開頭連續有 n 個字符都屬于字符串 accept 內的字符。
函數的調用示例如下面的代碼所示:
int main(void)
{
char str[] = "I welcome any ideas from readers, of course.";
printf("I wel:%d\n",strspn(str,"I wel"));
printf("Iwel:%d\n",strspn(str,"Iwel"));
printf("welcome:%d\n",strspn(str,"welcome"));
printf("5:%d\n",strspn(str,"5"));
return 0;
}
在上面的示例代碼中,因為 strspn 函數返回的是以字符串 s 開頭連續包含字符串 accept 內的字符數目。而源字符串 str 中的“I”與“welcome”之間有一個空格(即“I welcome”),所以,語句“strspn(str,"Iwel")”將返回 1,而語句“strspn(str,"I wel")”將返回 5。因此,輸出結果為:
I wel:5
Iwel:1
welcome:0
5:0
相對于 strspn 函數,strcspn 函數與之相反,它表示從字符串 s 第一個字符開始,逐個檢查字符與 reject 中的字符是否相同,如果相同,則停止檢查,并返回以字符串 s 開頭連續不含字符串 reject 內的字符數目。其函數原型的一般格式如下:
size_t strcspn(const char *s, const char *reject);
該函數的定義如下:
從上面的代碼中不難發現,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:%d\n",strcspn(str,"I wel"));
printf("Iwel:%d\n",strcspn(str,"Iwel"));
printf("welcome:%d\n",strcspn(str,"welcome"));
printf("5:%d\n",strcspn(str,"5"));
return 0;
}
在上面的示例代碼中,因為 strcspn 函數返回的是以字符串 s 開頭連續不包含字符串 accept 內的字符數目。因此,其運行結果為:
I wel:0
Iwel:0
welcome:2
5:45
由此可見,對于 strspn 函數,如果找到了 reject 與 s 不相同元素時,指針停止移動,并返回以字符串 s 開頭連續包含字符串 accept 內的字符數目;而 strncspn 函數則是找到了 reject 與 s 相同元素時,指針停止移動,并返回以字符串 s 開頭連續不包含字符串 accept 內的字符數目。這一點一定要注意,千萬不要混淆了。 作者: heicad 時間: 2022-3-18 03:42
好資料,51黑有你更精彩!!!