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;
}
}
認真比較兩者差別,會有更加深入的了解。