天天看點

了解strtok()函數

strtok()函數詳解!

1.定義

分解字元串為一組字元串。s為要分解的字元,delim為分隔符字元(如果傳入字元串,則傳入的字元串中每個字元均為分割符)。首次調用時,s指向要分解的字元串,之後再次調用要把s設成NULL。在頭檔案#include<string.h>中。

2.原型

char *strtok(char s[], const char *delim);

3.說明

(1)當strtok()在參數s的字元串中發現參數delim中包含的分割字元時,則會将該字元改為\0 字元。在第一次調用時,strtok()必需給予參數s字元串,往後的調用則将參數s設定成NULL。每次調用成功則傳回指向被分割出片段的指針。

(2)傳回值

從s開頭開始的一個個被分割的串。當s中的字元查找到末尾時,傳回NULL。如果查找不到delim中的字元時,傳回目前strtok的字元串的指針。所有delim中包含的字元都會被濾掉,并将被濾掉的地方設為一處分割的節點。

(3)需要注意的是,使用該函數進行字元串分割時,會破壞被分解字元串的完整,調用前和調用後的s已經不一樣了。第一次分割之後,原字元串str是分割完成之後的第一個字元串,剩餘的字元串存儲在一個靜态變量中,是以多線程同時通路該靜态變量時,則會出現錯誤

在實際使用中:

想要讀取<entity name作為參數name使用:

//讀取str一個空格隔斷時
void DtTextInterface::setheading(char* str)
{
	char *name;
	name = strtok(str, "\"");
	
	if (!name)
	{
		printf("\tusage: setheading <\"entity name\">\n");
		return;
	}
}
           
//當str第二個空格隔斷時
void DtTextInterface::setPlan(char* str)
{

   char *name = strtok(str, " ");
   name = strtok(NULL, "\"");
   
   if (!name)
   {
      printf("\tusage: set plan <\"entity name\">\n"); 
      return;
   }
 }
           

認真比較兩者差別,會有更加深入的了解。

繼續閱讀