C/C++ strtok 用法與範例

本篇 ShengYu 介紹 C/C++ strtok 用法與範例,strtok 是用來作字串分割的函式,以下介紹如何使用 strtok 函式。

C/C++ 要字串分割可以使用 strtok 來完成,要使用 strtok 的話需要引入的標頭檔 <string.h>,如果要使用 C++ 的標頭檔則是引入 <cstring>
strtok 函式原型為

1
char * strtok(char * str, const char * delimiters);

strtok() 會將 str 依據給入的 delimiters (分割符號/分隔符號) 進行字串分割,如果成功的話會回傳指向分割結果的字串開頭,否則會回傳 NULL,來看看下面的 strtok 用法範例吧!

如下範例所示,d 是分割符號/分隔符號,這邊示範用空格與逗號進行分割,如果有需要的話還可以在 delimiters 加入更多的分割符號,
p 是指向每次分割的結果,
要注意的是除了第一次是將 str 帶入 strtok 分割以外,第二次以上都是將 NULL 帶入 strtok 繼續作字串分割,

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

int main() {
char str[] = "Hello world, nice to meet you";
const char* d = " ,";
char *p;
p = strtok(str, d);

while (p != NULL) {
printf("%s\n", p);
p = strtok(NULL, d);
}
return 0;
}

結果如下,

1
2
3
4
5
6
Hello
world
nice
to
meet
you

因為 strtok 的實做原理是發現分割字元時,就把字元改為 \0 字元,意味著使用 strtok() 完後,原字串會被修改,
修改後的結果是 Hello\nworld\n\nnice\nto\nmeet\nyou 這樣的形式,所以原本的字串如果之後另有用途的話,記得先複製一份。

這邊我們先將 str 使用 strcpy() 複製一份到 str2 裡,並且在程式的最後分別印出 str 與 str2 看看,

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

int main() {
char str[] = "Hello world, nice to meet you";
char str2[64];
strcpy(str2, str);

const char* d = " ,";
char *p;
p = strtok(str, d);

while (p != NULL) {
printf("%s\n", p);
p = strtok(NULL, d);
}

printf("---\n");
printf("%s\n", str);
printf("%s\n", str2);
return 0;
}

結果如下,str 字串已經被修改了,原本 Hello 後面的空格被修改成 \0 字元,所以印出 str 字串只會看到 Hello,

1
2
3
4
5
6
7
8
9
Hello
world
nice
to
meet
you
---
Hello
Hello world, nice to meet you

以上就是 C/C++ strtok 的用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它參考
strtok - C++ Reference
https://www.cplusplus.com/reference/cstring/strtok/

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