strtok函式原始碼

2021-07-22 06:34:57 字數 1379 閱讀 9029

今天用到strtok時,總感覺怪怪的,為啥第二次呼叫第乙個引數要用null, 難道是函式內部儲存了當前的狀態,假如這樣的話,那就不能對多個串交叉呼叫strtok了,而且儲存這個狀態的不是全域性變數就是static變數。 於是看了他的原始碼,有幾個不同的版本,思想是一樣的。 感覺寫的挺巧妙的,深深的折服這些寫庫函式的牛人了。 下面是原始碼

版本一

char *s;            /* string to search for tokens */

const char *delim; /* delimiting characters */

while (strchr(delim, ch));

--s;

lasts = s + strcspn(s, delim);

if (*lasts != 0)

*lasts++ = 0;

return s;

}

上面用到了strcspn函式,這個函式返回值是n,表示s的前n個字元都沒有在delim中出現。原理是這樣的,函式在一開始判斷第乙個引數是不是空,假如是的話,也就是第二次呼叫這個函式了,那麼把上一次的狀態last賦值給要返回的串,然後那個do實現的功能其實就是strspn函式,這個函式的返回值是n,代表 s的前n個字元全部在delim出現。也就是說do實現的是跳過s中字元屬於分隔符的字元。 然後通過下面的strcspn真正擷取需要的字元數。所以last就指向了下乙個分隔符或者字元末尾。然後判斷last是否是末尾,假如不是的話,把當前的字元也就是分隔符標記成0,其實就是把前一段字元截斷了。last指向了下乙個字元。 然後返回s。

版本二 把do直接用 strspn函式代替,思想一樣的

#include /* strspn() strcspn() */

char *strtok(char * str, const char * delim)

第三個版本直接是 沒有使用任何函式,用的是雜湊實現,這個雜湊的妙處真是沒誰了,這才是真正c語言程式好不好

char*  strtok_r(char* string_org,const char* demial)    

do while (*ctrl++);

if (string_org) else

while ((map[*str >> 3] & (1 << (*str & 7))) && *str)

string_org = (char*)str;

for (;*str; str++)

}

last =str;

if (string_org == (char*)str)else

}

strtok函式巢狀

分解字串為一組字串。s為要分解的字元,delim為分隔符字元 如果傳入字串,則傳入的字串中每個字元均為分割符 首次呼叫時,s指向要分解的字串,之後再次呼叫要把s設成null。原型 extern char strtok char s,char delim 用法 include 功能 分解字串為一組標記...

waitpid函式原始碼

int sys waitpid pid t pid,unsigned long stat addr int options 掛起當前程序,直到pid指定的子程序退出終止或者收到要求終止該程序 的訊號 或者需要呼叫 乙個訊號處理函式 elseif pid elseif pid 1 以下的語名定為要找到...

strtok函式簡析

官方的strtok函式,用來通過分隔字元 不支援字串,傳入的串中每個字元單獨當分隔符,如下例子組合的如123會處理1而23會被跳過 返回分隔的串的首位址 比如呼叫strtok abc123def 123456 返回值是指向abc的指標 下次要獲得 def 需要呼叫strtok null,123456...