切割字串是程式員日常生活中常會遇到的事,例如古老的上班刷卡記錄檔,或是媒體申報檔,是用,(逗點)來隔開每個欄位值,如12,23,34,56,這時逗點稱為分隔符號(delimiter),每個欄位值稱為token.
很強大的正規表達式,也是常用來做切割字串的工作。
只是C語言的strtok不是很直覺的理解。
學本書的範例,和以往學習的習慣對抗。
書上並沒有strtok的例子,
從http://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
的例子,來理解作者的說明。
#include <string.h>
#include <stdio.h>
int main()
{
const char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL )
{
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
strtok玄機,在於第一次解析,第一個參數是傳入整個字串,第二次及之後多次解析,是傳入NULL。
這點不方便,當然給其他現代語言,改善的機會。
strtok 依作者說,因為它以static 內部指標的方式儲存未解析的字串,無法在多執行緒環境下使用,建議使用strtok_r,strtok_s這兩個執行緒安全的例子,
而這兩個會執行緒安全的改進版,請使用者在第三個參數,放一個字元(char)指標。
特別的是,我看了網路上很多中文繁簡例子,strtok_r,strtok_s 都是3個參數,
或
沒有 作者所說需要傳入4個參數的strtok_s , 多傳入len 長度的strtok_s例子,
//first use
size_t len = strlen(instring);
txt = strtok_s(instring, &len, delimiter, &scratch);
//subsequent use:
txt = strtok_s(NULL, &len, delimiter, &scratch);
這點很奇怪。