這次介紹 C 語言常用 string 函式:strstr,主要是針對兩個輸入參數做比對,Parameters 1 是輸入字串,Parameters 2 是找尋字串,strstr 會先將頭一次比對成功的 pointer 回傳,也就是如果要找尋 appleboyappleboy 字串中的 boy,函式會回傳第一次比對成功的 boy pointer,而並非回傳最後一個比對到的,底下是一個參考範例:
strstr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| /* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="This is a simple string";
char * pch;
/* 找尋 simple 字串 */
pch = strstr (str,"simple");
/* 將 simple 換成 sample */
strncpy (pch,"sample",6);
puts (str);
return 0;
}
|
看一下 Kernel 原始檔案,strstr 函式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| /*
* Find the first occurrence of find in s.
*/
char *
strstr(s, find)
const char *s, *find;
{
char c, sc;
size_t len;
if ((c = *find++) != 0) {
len = strlen(find);
do {
do {
if ((sc = *s++) == 0)
return (NULL);
} while (sc != c);
} while (strncmp(s, find, len) != 0);
s--;
}
return ((char *)s);
}
|
先將 sc 指定為內容字串,c 指定為找尋字串,利用兩個迴圈開始一一筆對,利用 strncmp 比對字串,在將比對成功的 pointer 回傳,但是回傳之前需要在將 s– 回到前一個指標,這樣就ok了。
strchr
這字串用來找尋第一次比對成功單一字母符號,也是一樣回傳該指標,底下是範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| /* strchr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "This is a sample string";
char * pch;
printf ("Looking for the 's' character in \"%s\"...\n",str);
pch=strchr(str,'s');
while (pch!=NULL)
{
printf ("found at %d\n",pch-str+1);
pch=strchr(pch+1,'s');
}
return 0;
}
|
上面範例很容易,那底下來看看完整 strchr 程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| char * strchr
(const char *p, int ch)
{
char c;
c = ch;
for (;; ++p) {
if (*p == c)
return ((char *)p);
if (*p == '\0')
return (NULL);
}
/* NOTREACHED */
}
|
就只能針對單一字母符號做搜尋,跟 strstr 不同的是 strstr 是針對多個字母符號搜尋,很好區別吧 ^^。
See also
- [Linux Kernel] 讀取 /proc 底下資料最佳方法: seq_file interface
- [C/C++] 判斷檔案是否存在 file_exists
- [C/C++] 將字串轉成 16 進位
- [C/C++] cstring (string.h) 函式:strcat, strncat, strcmp, strncmp
- [網站] 好站連結 (七) Android, javascript, Css, PHP, Perl, FreeBSD, Linux
- [C/C++] count 1 bits of input value by shifting.
- [C/C++] C語言切割字串函式 strsep,分析 URL GET 參數
- [C/C++] strpbrk 在字串中找尋指定的符號或字母
- [C/C++] 切割字串函數:strtok, Network mac address 分割
- [C/C++] 計算二進位任意數含有多少個位元為1?