日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

函数 —— strtok() 例如:Fred male 25,John male 62,Anna female 16两层循环

發(fā)布時間:2025/10/17 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数 —— strtok() 例如:Fred male 25,John male 62,Anna female 16两层循环 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

//char *strtok(char *str, const char *delim)
/*功能:
?* 函數(shù)用來將字符串分割成一個個片段*/
/*參數(shù):
?* str -- 要被分解成一組小字符串的字符串。
?* delim -- 包含分隔符的 C 字符串。*/
/*返回值:
?* 該函數(shù)返回被分解的最后一個子字符串,如果沒有可檢索的字符串,則返回一個空指針*/

#include <string.h> #include <stdio.h>int main() {//const char str[80] = "This is - www.w3cschool.cc - website";//strtok函數(shù) 對參數(shù)1 丟棄了 const限定符char str[80] = "This is - www.w3cschool.cc - website";const char s[2] = "-";char *token;/* 獲取第一個子字符串 */token = strtok(str, s);/* 繼續(xù)獲取其他的子字符串 */while( token != NULL ){printf( " %s\n", token );token = strtok(NULL, s);}return(0); }


問題描述:strtok()函數(shù)使用后會對原先的字符串進行破壞,如何使得分割后再重新拼接,放回原先的字符串定義的變量中

代碼部分:

#include <string.h> #include <stdio.h> int main() {int i = 1;char str[80] = "This is - aa bb - cc - dd";const char s[2] = "-";char cont[80]= {0};char ss[80]= {0};char *token = (strtok(str,s));while(token){sprintf(cont,"%s",token);printf("第%d次分割后,字符串為:%s\n", i, token);token = strtok(NULL,s);strcat(ss,cont);i++;}printf("拼接成的字符串:%s\n",ss);printf("原變量str中的字符串:%s\n",str);memset(str,0,strlen(str));strcat(str,ss);printf("給原先的變量str賦值:%s\n",str);return 0; }

結(jié)果顯示:

第1次分割后,字符串為:This is 第2次分割后,字符串為: aa bb 第3次分割后,字符串為: cc 第4次分割后,字符串為: dd 拼接成的字符串:This is aa bb cc dd 原變量str中的字符串:This is 給原先的變量str賦值:This is aa bb cc dd

***************************對函數(shù)(strtok 與 strtok_t)的深入理解*****************************

***********https://www.cnblogs.com/zhouhbing/p/4103916.html****************************

?

strtok函數(shù)的使用是一個老生常談的問題了。該函數(shù)的作用很大,爭議也很大。以下的表述可能與一些資料有區(qū)別或者說與你原來的認識有差異,因此,我盡量以實驗為證。交代一下實驗環(huán)境是必要的,winxp+vc6.0,一個極端平民化的實驗環(huán)境。本文中使用的源代碼大部分來自于網(wǎng)絡,我稍加修改作為例證。當然,本人水平有限,有不妥之處在所難免,各位見諒的同時不妨多做實驗,以實驗為證。

strtok的函數(shù)原型為char *strtok(char *s, char *delim),功能為“Parse S into tokens separated by characters in DELIM.If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. ” 翻譯成漢語就是:作用于字符串s,以包含在delim中的字符為分界符,將s切分成一個個子串;如果,s為空值NULL,則函數(shù)保存的指針SAVE_PTR在下一次調(diào)用中將作為起始位置。

函數(shù)的返回值為從指向被分割的子串的指針。

這個定義和國內(nèi)一些網(wǎng)站上的說法有一些差別,正是這些差別導致很多人對strtok沒有一個正確的認識。希望讀者在調(diào)用一些函數(shù)前,最好能夠讀一讀官方的文檔(多半都是英文的),而非看一些以訛傳訛的資料。

?

使用strtok需要注意的有以下幾點:

?

1.函數(shù)的作用是分解字符串,所謂分解,即沒有生成新串,只是在s所指向的內(nèi)容上做了些手腳而已。因此,源字符串s發(fā)生了變化!

設源字符串s為 char buffer[INFO_MAX_SZ]=",Fred male 25,John male 62,Anna female 16";? 過濾字符串delim為 char *delim = " ",即空格為分界符。

?

上圖的代碼會產(chǎn)生這樣的結(jié)果:

首先,buffer發(fā)生了變化。如果此時打印buffer的值,會顯示“,Fred”,而后面" male 25…16”不翼而飛了。實際上,strtok函數(shù)根據(jù)delim中的分界符,找到其首次出現(xiàn)的位置,即Fred后面那個空格(buffer[5]),將其修改成了'/0’。其余位置不變。這就很好解釋為什么打印buffer的值只能出現(xiàn)“,Fred”,而非buffer中的全部內(nèi)容了。因此,使用strtok時一定要慎重,以防止源字符串被修改。?

理解了buffer的變化,就很好解釋函數(shù)的返回值了。返回值buf為分界符之前的子串(其實這個說法并不確切,詳見"3”中對于返回值的詳細說明)。注意,由變量的地址可知,buf依然指向源字符串。

?

分界符delim沒有發(fā)生變化,就不再截圖了。

?

2.若要在第一次提取子串完畢之后,繼續(xù)對源字符串s進行提取,應在其后(第二次,第三次。。。第n次)的調(diào)用中將strtok的第一個參數(shù)賦為空值NULL。

?

第一次調(diào)用的結(jié)果如前文所述,提取出了",Fred”。我們還想繼續(xù)以空格為分界,提取出后面的"male”等。由上圖可以看到,第一次之后的調(diào)用我們都給strtok的第一個參數(shù)傳遞了空值NULL(表示函數(shù)繼續(xù)從上一次調(diào)用隱式保存的位置,繼續(xù)分解字符串;對于上述的第二次調(diào)用來說,第一次調(diào)用結(jié)束前用一個this指針指向了分界符的下一位,即'm’所在的位置),這樣可依次提取出

?,?。。。。以此類推。。。。。

至于為什么要賦空值,要么你就記住結(jié)論,要么去查strtok的源代碼。本文的最后會有一些介紹。

當然也有部分愛鉆牛角尖的人,非不按套路出牌,要看看不賦空值繼續(xù)賦值為buffer會有什么結(jié)果。其實,答案想也能想的到。再一次傳遞buffer,相當于還從字符串的開頭查找分界符delim,而且此時buffer已經(jīng)被修改(可見的部分只剩下",Fred”),因此,其結(jié)果必然是找不到分界符delim。

?

3.關(guān)于函數(shù)返回值的探討

由"1”中所述,在提取到子串的情況下,strtok的返回值(假設返回值賦給了指針buf)是提取出的子串的指針。這個指針指向的是子串在源字符串中的起始位置。子串末尾的下一個字符在提取前為分隔符,提取后被修改成了'/0’。因此,若打印buf的值,可以成功的輸出子串的內(nèi)容。

在沒有提取到子串的情況下,函數(shù)會返回什么值呢?

?

由上圖可以看到buffer中并不包含分界符delim。調(diào)用strtok后buf的值為

?

因為沒有找到,源字符串buffer沒有發(fā)生改變,buf指向源字符串的首地址,打印輸出的值為整個字符串的完整值。

什么時候函數(shù)的返回值為空值NULL呢?

百度百科上說,“當沒有被分割的串時則返回NULL。”這是一個很模棱兩可的說法。如果想要確切的了解清楚這個問題,可能需要看一下strtok的實現(xiàn)原理。這里先以實驗說明。

?

第一次調(diào)用strtok,毫無疑問,buf指向",Fred”。

第二次調(diào)用strtok,由于第一個參數(shù)為NULL,表示函數(shù)繼續(xù)以上次調(diào)用所保存的this指針的位置開始分解,即對"male 25”分解。分解完畢后,buf指向"male”。

第三次調(diào)用strtok,參數(shù)繼續(xù)設定為NULL,此時即對第二次保存的this指針的位置開始分解,即對"25”分解。因為無法找到包含分隔符delim的子串,所以buf指向"25”。

第四次調(diào)用,參數(shù)仍為NULL,此時第三次調(diào)用保存的this指針已指向字符串的末尾'/0’,已無法再進行分解。因此函數(shù)返回NULL,這也就是百度百科中所提到的“當沒有被分割的串時函數(shù)返回NULL。”

?

4.參數(shù) 分隔符delim的探討(delim是分隔符的集合)

很多人在使用strtok的時候,都想當然的以為函數(shù)在分割字符串時完整匹配分隔符delim,比如delim=”ab”,則對于"acdab”這個字符串,函數(shù)提取出的是"acd”。至少我在第一次使用的時候也是這么認為的。其實我們都錯了,我是在看函數(shù)的源代碼時才發(fā)現(xiàn)這個問題的,且看下面的例子。

源字符串為buffer,分隔符delim為 逗號和空格,按照一般的想法我們會以為調(diào)用函數(shù)后,buf的值為"Fred,male,25”,結(jié)果是這樣么?

第一次調(diào)用之后的結(jié)果竟然是"Fred”,而非我們所想的結(jié)果。這是為什么呢?

我們回到GNU C Library中對strtok的功能定義:“Parse S into tokens separated by characters in DELIM”。也就是說包含在delim中的字符均可以作為分隔符,而非嚴格匹配。可以把delim理解為分隔符的集合。這一點是非常重要的~

當然,我們在分解字符串的時候,很少使用多個分隔符。這也導致,很多人在寫例子的時候只討論了一個分隔符的情況。有更多的人在看例子的時候也就錯誤的認識了delim的作用。

?

?

5.待分解的字符串,首字符就為分隔符

首字符為分隔符不能算作一個很特殊的情況。按照常規(guī)的分解思路也能正確分解字符串。

我想說明的是,strtok對于這種情況采用了比常規(guī)處理更快的方式。

如上圖例子所示。僅用一次調(diào)用就可以得到以逗號分隔的字符串"Fred male 25”,而F前面的','被忽略了。由此可見,strtok在調(diào)用的時候忽略了起始位置開始的分隔符。這一點,可以從strtok的源代碼得到證實。

?

6.不能向第一個參數(shù)傳遞字符串常量!

本文中所舉的例子都將源字符串保存為字符串數(shù)組變量。若你將源字符串定義成字符串常量,可想而知,程序會因為strtok函數(shù)試圖修改源字符串的值,而拋出異常。

?

好了,本文詳細介紹了使用strtok的注意事項,(二)中我將詳細介紹strtok不能實現(xiàn)的一些功能并引出strtok_r函數(shù),最后介紹一下兩個函數(shù)的實現(xiàn)。

(一)中已經(jīng)介紹了使用strtok函數(shù)的一些注意事項,本篇將介紹strtok的一個應用并引出strtok_r函數(shù)。

?

1.一個應用實例

網(wǎng)絡上一個比較經(jīng)典的例子是將字符串切分,存入結(jié)構(gòu)體中。如,現(xiàn)有結(jié)構(gòu)體

typedef struct person{?
??? char name[25];?
??? char sex[10];?
??? char age[4];?
}Person;

需從字符串 char buffer[INFO_MAX_SZ]="Fred male 25,John male 62,Anna female 16"; 中提取出人名、性別以及年齡。

一種可行的思路是設置兩層循環(huán)。外循環(huán),先以 ',’ (逗號) 為分界符,將三個人的信息分開,然后對于每一個子串,再以 ' ’(空格) 為分界符分別得到人名、性別和年齡。

按照這個思路,理應能夠?qū)崿F(xiàn)所要的功能。為了簡化步驟,我們調(diào)用strtok,先將子串先一一保存到字符串指針數(shù)組中,程序末尾打印指針數(shù)組中保存的所有子串,驗證程序的正確性。得到的程序應該如下:

?[cpp]?view plaincopy

?

  • int?in=0;??
  • char?buffer[INFO_MAX_SZ]="Fred?male?25,John?male?62,Anna?female?16";??????
  • char?*p[20];??
  • char?*buf?=?buffer;??
  • while((p[in]=strtok(buf,","))!=NULL)???
  • {??
  • ????buf=p[in];??
  • ????while((p[in]=strtok(buf,"?"))!=NULL)???
  • ????{??
  • ????????in++;??
  • ????????buf=NULL;??
  • ????}??
  • ????buf=NULL;??
  • }??
  • printf("Here?we?have?%d?strings/n",?in);??
  • for?(int?j=0;?j<in;?j++)??
  • {?????
  • ????printf(">%s</n",p[j]);??
  • }??
  • ?

    ?

    執(zhí)行的結(jié)果是,僅僅提取出了第一個人的信息。看來程序的執(zhí)行并沒有按照我們的預想。原因是什么?

    原因是:在第一次外循環(huán)中,strtok將"Fred male 25,"后的這個逗號,改為了'\0’,這時strtok內(nèi)部的this指針指向的是逗號的后一個字符'J’。經(jīng)過第一次的內(nèi)循環(huán),分別提取出了“Fred” “male” “25”。提取完"25”之后,函數(shù)內(nèi)部的this指針被修改指向了"25”后面的'\0’。內(nèi)循環(huán)結(jié)束后(內(nèi)循環(huán)實際執(zhí)行了4次),開始第二次的外循環(huán),由于函數(shù)第一個參數(shù)被設定為NULL,strtok將以this指針指向的位置作為分解起始位置。很遺憾,此時this指針指向的是'\0’,strtok對一個空串無法切分,返回NULL。外循環(huán)結(jié)束。所以,我們只得到了如圖所示的第一個人的信息。

    ?

    看來使用strtok并不能通過兩層循環(huán)的辦法,解決提取多人信息的問題。有沒有其他辦法呢? 顯然,是有其他途徑的。

    我給出了一種解決辦法。同時以 ',’ (逗號) 和 ' ’(空格) 為分界符,一層循環(huán)解決問題。

    ?[cpp]?view plaincopy

    ?

  • in?=?0;??
  • while?((p[in]?=?strtok(buf,?"?,"))?!=?NULL)??
  • {??
  • ????switch?(in?%?3)??
  • ????{??
  • ????case?0:??
  • ????????printf("第%d個人:Name!/n",?in/3+1);??
  • ????????break;??
  • ????case?1:??
  • ????????printf("第%d個人:Sex!/n",?in/3+1);??
  • ????????break;??
  • ????case?2:??
  • ????????printf("第%d個人:Age!/n",?in/3+1);??
  • ????????break;??
  • ????}??
  • ????in++;??
  • ????buf?=?NULL;??
  • }??
  • printf("Here?we?have?%d?strings/n",?in);??
  • for?(int?j=0;?j<in;?j++)??
  • {?????
  • ????printf(">%s</n",p[j]);??
  • }??
  • ?

    ?

    程序雖然可以達到理想的結(jié)果,但不是一個太好解決方案。程序要求你在提取之前必須要知道一個結(jié)構(gòu)體中究竟包含了幾個數(shù)據(jù)成員。明顯不如雙重循環(huán)那樣直觀。

    倘若一定要采用二重循環(huán)那種結(jié)構(gòu)提取,有沒有合適的函數(shù)能夠代替strtok呢? 有的,它就是strtok_r。

    ?

    2.strtok_r及其使用

    strtok_r是linux平臺下的strtok函數(shù)的線程安全版。windows的string.h中并不包含它。要想使用這個函數(shù),上網(wǎng)搜其linux下的實現(xiàn)源碼,復制到你的程序中即可。別的方式應該也有,比如使用GNU C Library。我下載了GNU C Library,在其源代碼中找到了strtok_r的實現(xiàn)代碼,復制過來。可以看作是第一種方法和第二種方法的結(jié)合。

    strtok的函數(shù)原型為?char *strtok_r(char *str, const char *delim, char **saveptr);

    下面對strtok的英文說明摘自http://www.linuxhowtos.org/manpages/3/strtok_r.htm,譯文是由我給出的。

    The?strtok_r() function is a reentrant version?strtok(). The?saveptr?argument is a pointer to a?char *?variable that is used internally by?strtok_r() in order to maintain context between successive calls that parse the same string.

    strtok_r函數(shù)是strtok函數(shù)的可重入版本。char **saveptr參數(shù)是一個指向char *的指針變量,用來在strtok_r內(nèi)部保存切分時的上下文,以應對連續(xù)調(diào)用分解相同源字符串。

    On the first call to?strtok_r(),?str?should point to the string to be parsed, and the value of?saveptr?is ignored. In subsequent calls,?str?should be NULL, and?saveptr?should be unchanged since the previous call.

    第一次調(diào)用strtok_r時,str參數(shù)必須指向待提取的字符串,saveptr參數(shù)的值可以忽略。連續(xù)調(diào)用時,str賦值為NULL,saveptr為上次調(diào)用后返回的值,不要修改。

    Different strings may be parsed concurrently using sequences of calls to?strtok_r() that specify different?saveptrarguments.

    一系列不同的字符串可能會同時連續(xù)調(diào)用strtok_r進行提取,要為不同的調(diào)用傳遞不同的saveptr參數(shù)。

    The?strtok() function uses a static buffer while parsing, so it's not thread safe. Use?strtok_r() if this matters to you.

    strtok函數(shù)在提取字符串時使用了靜態(tài)緩沖區(qū),因此,它是線程不安全的。如果要顧及到線程的安全性,應該使用strtok_r。

    ?

    strtok_r實際上就是將strtok內(nèi)部隱式保存的this指針,以參數(shù)的形式與函數(shù)外部進行交互。由調(diào)用者進行傳遞、保存甚至是修改。需要調(diào)用者在連續(xù)切分相同源字符串時,除了將str參數(shù)賦值為NULL,還要傳遞上次切分時保存下的saveptr。

    舉個例子,還記得前文提到的提取結(jié)構(gòu)體的例子么?我們可以使用strtok_r,以雙重循環(huán)的形式提取出每個人的信息。

    ?

    [cpp]?view plaincopy

    ?

  • int?in=0;??
  • char?buffer[INFO_MAX_SZ]="Fred?male?25,John?male?62,Anna?female?16";??
  • char?*p[20];??
  • char?*buf=buffer;??
  • char?*outer_ptr=NULL;??
  • char?*inner_ptr=NULL;??
  • while((p[in]?=?strtok_r(buf,?",",?&outer_ptr))!=NULL)???
  • {??
  • ????buf=p[in];??
  • ????while((p[in]=strtok_r(buf,?"?",?&inner_ptr))!=NULL)???
  • ????{??
  • ????????in++;??
  • ????????buf=NULL;??
  • ????}??
  • ????buf=NULL;??
  • }??
  • printf("Here?we?have?%d?strings/n",in);??
  • for?(int?j=0;?j<in;?j++)??
  • {?????
  • ????printf(">%s</n",p[j]);??
  • }??
  • ?

    調(diào)用strtok_r的代碼比調(diào)用strtok的代碼多了兩個指針,outer_ptr和inner_ptr。outer_ptr用于標記每個人的提取位置,即外循環(huán);inner_ptr用于標記每個人內(nèi)部每項信息的提取位置,即內(nèi)循環(huán)。具體過程如下:

    (1)第1次外循環(huán),outer_ptr忽略,對整個源串提取,提取出"Fred male 25",分隔符',' 被修改為了'\0’,outer_ptr返回指向'J’。

    (2)第一次內(nèi)循環(huán),inner_ptr忽略,對第1次外循環(huán)的提取結(jié)果"Fred male 25"進行提取,提取出了"Fred",分隔符' '被修改為了'\0',inner_ptr返回指向'm'。

    (3)第二次內(nèi)循環(huán),傳遞第一次內(nèi)循環(huán)返回的inner_ptr,第一個參數(shù)為NULL,從inner_ptr指向的位置'm'開始提取,提取出了"male",分隔符? ' '被修改為了'\0',inner_ptr返回指向'2'。

    (4)第三次內(nèi)循環(huán),傳遞第二次內(nèi)循環(huán)返回的inner_ptr,第一個參數(shù)為NULL,從inner_ptr指向的位置'2'開始提取,提取出了"25",因為沒有找到' ',inner_ptr返回指向25后的'\0'。

    (5)第四次內(nèi)循環(huán),傳遞第三次內(nèi)循環(huán)返回的inner_ptr,第一個參數(shù)為NULL,因為inner_ptr指向的位置為'\0',無法提取,返回空值。結(jié)束內(nèi)循環(huán)。

    (6)第2次外循環(huán),傳遞第1次外循環(huán)返回的outer_ptr,第一個參數(shù)為NULL,從outer_ptr指向的位置'J'開始提取,提取出"John male 62",分隔符',’被修改為了'\0’,outer_ptr返回指向'A’。(調(diào)用strtok則卡死在了這一步)

    ……以此類推,外循環(huán)一次提取一個人的全部信息,內(nèi)循環(huán)從外循環(huán)的提取結(jié)果中,二次提取個人單項信息。

    可以看到strtok_r將原內(nèi)部指針顯示化,提供了saveptr這個參數(shù)。增加了函數(shù)的靈活性和安全性。

    ?

    3.strtok和strtok_r的源代碼

    這兩個函數(shù)的實現(xiàn),由眾多的版本。我strtok_r來自于GNU C Library,strtok則調(diào)用了strtok_r。因此先給出strtok_r的源代碼。

    ?

    [cpp]?view plaincopy

    ?

  • /*?Parse?S?into?tokens?separated?by?characters?in?DELIM.?
  • ???If?S?is?NULL,?the?saved?pointer?in?SAVE_PTR?is?used?as?
  • ???the?next?starting?point.??For?example:?
  • ????????char?s[]?=?"-abc-=-def";?
  • ????????char?*sp;?
  • ????????x?=?strtok_r(s,?"-",?&sp);??????//?x?=?"abc",?sp?=?"=-def"?
  • ????????x?=?strtok_r(NULL,?"-=",?&sp);??//?x?=?"def",?sp?=?NULL?
  • ????????x?=?strtok_r(NULL,?"=",?&sp);???//?x?=?NULL?
  • ????????????????//?s?=?"abc\0-def\0"?
  • */??
  • char?*strtok_r(char?*s,?const?char?*delim,?char?**save_ptr)?{??
  • ????char?*token;??
  • ??
  • ????if?(s?==?NULL)?s?=?*save_ptr;??
  • ??
  • ????/*?Scan?leading?delimiters.??*/??
  • ????s?+=?strspn(s,?delim);??
  • ????if?(*s?==?'\0')???
  • ????????return?NULL;??
  • ??
  • ????/*?Find?the?end?of?the?token.??*/??
  • ????token?=?s;??
  • ????s?=?strpbrk(token,?delim);??
  • ????if?(s?==?NULL)??
  • ????????/*?This?token?finishes?the?string.??*/??
  • ????????*save_ptr?=?strchr(token,?'\0');??
  • ????else?{??
  • ????????/*?Terminate?the?token?and?make?*SAVE_PTR?point?past?it.??*/??
  • ????????*s?=?'\0';??
  • ????????*save_ptr?=?s?+?1;??
  • ????}??
  • ??
  • ????return?token;??
  • }??

  • ?

    ?

    代碼整體的流程如下:

    (1)判斷參數(shù)s是否為NULL,如果是NULL就以傳遞進來的save_ptr作為起始分解位置;若不是NULL,則以s開始切分。

    (2)跳過待分解字符串開始的所有分界符。

    (3)判斷當前待分解的位置是否為'\0',若是則返回NULL(聯(lián)系到(一)中所說對返回值為NULL的解釋);不是則繼續(xù)。

    (4)保存當前的待分解串的指針token,調(diào)用strpbrk在token中找分界符:如果找不到,則將save_ptr賦值為待分解串尾部'\0'所在的位置,token沒有發(fā)生變化;若找的到則將分界符所在位置賦值為'\0',token相當于被截斷了(提取出來),save_ptr指向分界符的下一位。

    (5)函數(shù)的最后(無論找到還是沒找到)都將返回。

    對于函數(shù)strtok來說,可以理解為用一個內(nèi)部的靜態(tài)變量將strtok_r中的save_ptr給保存起來,對調(diào)用者不可見。其代碼如下:

    ?

    [cpp]?view plaincopy

    ?

  • char?*strtok(char?*s,?const?char?*delim)??
  • {??
  • ????static?char?*last;??
  • ??
  • ????return?strtok_r(s,?delim,?&last);??
  • }??
  • ?

    ?

    有了上述兩個函數(shù)的實現(xiàn)代碼,再理解(一)(二)中所講的一些要點也就不困難了。

    花那么多篇幅總結(jié)這兩個函數(shù),一來是因為很對人對于strtok的誤解比較深,網(wǎng)上很少有對于其非常詳細的討論,因此總結(jié)一份比較全面的材料,是有必要的;二來這也是自己不斷學習的一個過程,總結(jié)會得到遠比兩個函數(shù)重要很多的信息。

    ?

    總結(jié)

    以上是生活随笔為你收集整理的函数 —— strtok() 例如:Fred male 25,John male 62,Anna female 16两层循环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。