【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進行分隔的效果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章