標籤:c語言 strtok函數 null
一、strtok( )函數
strtok( )函數包含於標頭檔string.h
文法:char *strtok( char *str1, const char *str2 );
功能:函數返回字串str1中緊接“標記”的部分的指標, 字串str2是作為標記的分隔字元。如果分隔標記沒有找到,函數返回NULL。為了將字串轉換成標記,第一次調用str1 指向作為標記的分隔字元。之後所以的調用str1 都應為NULL
二、代碼
#include<stdio.h>#include<string.h>int main(){char p[]="My name is XiaoMing.";char tmp[20];char *sep=" ";char *token=NULL;strcpy(tmp,p);for(token=strtok(tmp,sep);token != NULL;token=strtok(NULL,sep)){printf("%s\n",token);}return 0;}
三、運行結果
四、淺談strtok( )函數與NULL
函數strtok( char *str1, const char *str2 ) 涉及到兩個指標。
第一個指標pointer_a用來指向函數返回的字串,這個字串是被原字串OriginalString被seps中的字元截斷後的第一個字串。
第二個指標pointer_b用來指向OriginalString中,匹配截斷字串seps的位置。
如果在第二次函數調用的時候,第一個參數不是設定為NULL而是設為原來的字串"My name is XiaoMing.",那麼講永遠返回"My"並且也將陷入死迴圈。
為何會出現這種結果呢?
原因是:
第一次調用這個函數是在while迴圈體之外(第19行),此時,字串"My name is XiaoMing." 中匹配token(即參數seps代表的各種字元,如本例中," ,/t/n"表示空格,逗號,定位字元,分行符號這四種字元)中所指定的字元的位置在My和name之間。於是,函數的返回值pointer_a為一個指向”My”的指標。此時,pointer_b指向My和name之間的位置,代表pointer_b之前的位置已經進行過尋找匹配了。
這樣,在迴圈體之內進行第二次函數調用的時候,只要把strtok()的第一個參數設定為NULL,就可以直接從pointer_b位置開始進行尋找匹配了。
所以,NULL的作用只是為了使得每次調用時,都不是從"My name is XiaoMing."的頭開始,而是從上次調用時尋找所停止的位置開始,如此迴圈下去,直到無法再找到匹配token的時候位置,這樣就實現了把"My name is XiaoMing."按照token進行分隔的效果。
【C語言】淺談strtok()與NULL