iT邦幫忙

DAY 18
0

21世紀C語言實作及感想系列 第 18

21世紀C語言之18 : strtok, strtok_r,strtok_s

  • 分享至 

  • xImage
  •  

切割字串是程式員日常生活中常會遇到的事,例如古老的上班刷卡記錄檔,或是媒體申報檔,是用,(逗點)來隔開每個欄位值,如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個參數,

  • char *p;
  • char *token=strtok_s(sentence,".",&p);

  • char *p;
  • char str1[] = "102.122..164";
  • char *c1 = strtok_r(str1,".1",&p);

沒有 作者所說需要傳入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);

這點很奇怪。


上一篇
21世紀C語言之17 : __VA_ARGS__和...和args...和##
下一篇
21世紀C語言之19 :單元測試
系列文
21世紀C語言實作及感想30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言