C/C++ 字串搜尋的3種方法

本篇 ShengYu 介紹 C/C++ 字串搜尋的3種方法,字串處理中字串搜尋是很常被使用的功能,例如:在檔案內容裡搜尋某個字串,瀏覽器上搜尋字串、文字編輯器上搜尋字串等等都是這個的應用,可見字串搜尋這功能多麼地頻繁與實用呀!在寫程式中字串搜尋是基本功夫,而且也蠻常會用到的,這邊紀錄我曾經用過與所知道的字串搜尋的幾種方式,
以下為 C/C++ 字串搜尋的內容章節,

  • C 語言的 strstr
  • C 語言的 strchr
  • C++ string 的 find()

那我們就開始吧!

C 語言的 strstr

C 語言要搜尋字串通常會使用 strstr,要使用 strstr 的話需要引入的標頭檔 <string.h>
strstr 函式原型為

1
char * strstr(char * str1, const char * str2);

strstr() 會將 str1 字串搜尋 str2 字串,有找到會回傳指向 str1 的指標並且指向第一次符合的位置,沒找到會回傳 NULL,來看看下面的 strstr 用法範例吧!

cpp-string-find.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ cpp-string-find.cpp -o a.out
#include <stdio.h>
#include <string.h>

int main() {
char str[] ="This is a c-style string";
char *pch;
pch = strstr(str, "c-style");
if (pch != NULL)
printf("found: %s\n", pch);
else
printf("not found\n");

return 0;
}

結果如下,

1
found: c-style string

C 語言的 strchr

C 語言要在字串裡搜尋字元的話,除了自己寫迴圈處理外,也可以使用 C 語言提供的 strchr,
以下示範在字串裡搜尋 t 這個字元,第一次有成功找到,下一次要在搜尋時可以在找到的地方 pch+1 再往後搜尋,

cpp-string-find2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// g++ cpp-string-find2.cpp -o a.out
#include <stdio.h>
#include <string.h>

int main() {
char str[] ="This is a c-style string";
char *pch;

// find first t
pch = strchr(str, 't');
if (pch != NULL)
printf("found at %d\n", pch-str+1);

// find second t
pch = strchr(pch+1, 't');
if (pch != NULL)
printf("found at %d\n", pch-str+1);

return 0;
}

結果輸出如下,

1
2
found at 14
found at 20

如果是使用 std::string 的話,在字串搜尋上就有一些方便的成員函式可以使用,以下介紹 C++ std::string 字串搜尋的方式,

C++ string 的 find()

這邊介紹 C++ string 的 find(),std::string 使用 find() 可以搜尋字串,有找到會回傳找到的位置,沒找到會回傳 string::npos,

cpp-string-find3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// g++ cpp-string-find3.cpp -o a.out
#include <iostream>
#include <string>
using namespace std;

int main() {
string str = "This is a c++ string";

str.find("is");

size_t found = str.find("is");
if (found != string::npos) {
cout << "found at " << found << "\n";
}

return 0;
}

結果如下,

1
found at 2

其它參考
strstr - C++ Reference
https://www.cplusplus.com/reference/cstring/strstr/
strchr - C++ Reference
https://www.cplusplus.com/reference/cstring/strchr/
string::find - C++ Reference
https://www.cplusplus.com/reference/string/string/find/

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ 字串比較的3種方法
C/C++ 字串連接的3種方法
C/C++ 字串分割的3種方法
std::find 用法與範例