1. 程式人生 > 其它 >字串分割: strtok和strtok_s函式使用說明

字串分割: strtok和strtok_s函式使用說明

strtok和strtok_s函式使用說明

火鍋冰闊樂

已於 2022-11-05 15:13:58 修改

53
收藏
分類專欄: C++ C 文章標籤: c++
版權

C++
同時被 2 個專欄收錄
4 篇文章0 訂閱
訂閱專欄

C
1 篇文章0 訂閱
訂閱專欄
看了很多高贊CSDN文章和百度百科,越看越暈,浪費好多時間,特此記錄
先介紹strtok,後邊給個strtok_s的例子

注意:這兩個函式必要連續呼叫多次才能實現分割和輸出功能,一般和while迴圈配合,初始呼叫和後續呼叫有些區別,把握這一點就ok了

01 定義
定義於標頭檔案 cstring
函式原型
char* strtok( char* str, const char* delim );

02 呼叫說明
尋找 str 所指向的空終止位元組字串中的下個記號。由 delim 所指向的空終止位元組字串鑑別分隔字元。

此函式被設計為呼叫多次,以從同一字串獲得相繼的記號。

若 str 不是空指標,則呼叫被當做 strtok 對此特定字串的首次呼叫。函式搜尋首個不含於 delim 的字元。
若找不到這種字元,則 str 中完全沒有記號,而函式返回空指標。
若找到這種字元,則它是記號的起始。然後函式從 delim 所含的首個字元的該點搜尋。
若找不到這種字元,則 str 只有一個記號,而將來對 strtok 的呼叫將返回空指標
若找到這種字元,則用空字元 ‘\0’ 替換它,並將指向下個字元的指標儲存於靜態位置,以為後繼呼叫所用。
然後函式返回指向記號起始的指標

若 str 為空指標,則將呼叫當做對 strtok 的後繼呼叫,函式從先前呼叫中它剩下的位置開始。行為如同將先前儲存的指標作為 str 傳遞。

03 引數
str - 指向要記號化的空終止位元組字串的指標
delim - 指向標識分隔符的空終止位元組字串的指標

04 返回值
指向下個記號起始的指標,或若無更多記號則為空指標。

05 註解
此函式是破壞性的:它寫入 ‘\0’ 字元於字串 str 的元素。特別是,字串字面量不能用作 strtok 的首引數。

每次對 strtok 的呼叫都會修改靜態物件:它不是執行緒安全的。

不同於大多數其他記號化器, strtok 中的分隔符能對於後繼記號不同,而且甚至能依賴於先前記號的內容。

06 程式碼示例
#include <cstring>
#include <iostream>

int main()
{
char input[100] = "A bird came down the walk";
char *token = std::strtok(input, " ");
while (token != NULL) {
std::cout << token << '\n';
token = std::strtok(NULL, " ");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
08 拓展strtok_s
函式原型
char *strtok_s(char * str, const char * delim, char **ptr);
說明
strtok_s是strtok執行緒安全版本,使用方法大同小異,多了一個存放剩餘字元的地址引數,說白了就是分割完剩下的找個地址存好,方便下一次用

void test() {

char str[] = "ab,cd,ef";


cout << "原始字串為:" << str << endl;

char* token;
char* next_token;

token = strtok_s(str, ",", &next_token); //初始呼叫

while (token != NULL) { // 後續找不到返回Null就退出

printf("分割子字串%s\n", token);
printf("剩餘字串=%s\n", next_token);

token = strtok_s(NULL, ",", &next_token); // 後續呼叫
}


}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
07 參考連結
https://www.apiref.com/cpp-zh/cpp/string/byte/strtok.html
https://www.apiref.com/cpp-zh/c/string/byte/strtok.html
Ps:這個網站也是一個很好的函式文件網站
————————————————
版權宣告:本文為CSDN博主「火鍋冰闊樂」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_42287144/article/details/127703574