天天看點

分割字元串:strtok()函數

  函數strtok将字元串分解為一系列标記(token)标記就是一系列用分隔符(delimiting chracter,通常是空格或标點符号)分開的字元。例如,在一行文本中,每個單詞可以作為标記,空格是分隔符。

  需要多次調用strtok才能将字元串分解為标記(假設字元串中包含多個标記)。第一次調用strtok包含兩個參數,即要标記化的字元串和包含用來分隔标記的字元的字元串(即分隔符):在圖5.33的例子中,下列語句:

  tokenPtr = Strtok(string, " ");

  将tokenPtr賦給string中第一個标記的指針。strtok的第二個參數""表示string中的标記用空格分開。

  函數strtok搜尋string中不是分隔符(空格)的第一個字元,這是第一個标記的開頭。然後函數尋找字元串中的下一個分隔符,将其換成null(, w,)字元,這是目前标記的終點。函數strtok儲存string中标記後面的下一個字元的指針,并傳回目前标記的指針。

  後面再調用strtok時,第一個參數為NULL,繼續将string标記化。NULL參數表示調用strtok繼續從string中上次調用 strtok時儲存的位置開始标記化。如果調用strtok時已經沒有标記,則strtok傳回NULL。圖5.33的程式用strtok将字元串" This is sentence with 7 tokens"标記化。分别列印每個标記。注意strtok修改輸入字元串,是以,如果調用strtok之後還要在程式中使用這個字元串,則應複制這個字 符串。

  常見程式設計錯誤5.23

  沒有認識到strtok修改正在标記化的字元串,調用sstrtok後還在程式中使用這個字元串(以為還是原字元串) 函數strlen取一個字元串作為參數,并傳回字元串中的字元個數,長度中不包括null終止符。

  圖5.34的程式示範了函數strlen。

  1 // Fig. 5.33:fig05 33.cpp

  2 // Using strtok

  #include #include int main() { char string[] = "This is a sentence with 7 tokens"; char *tokenPtr; cout #include #ifdef _MT #include #endif char * __cdecl strtok ( char * string, const char * control ) { unsigned char *str; const unsigned char *ctrl = control; unsigned char map[32]; int count; #ifdef _MT _ptiddata ptd = _getptd(); #else static char *nextoken; #endif for (count = 0; count > 3] |= (1 _token; #else str = nextoken; #endif while ( (map[*str >> 3] & (1 > 3] & (1 _token = str; #else nextoken = str; #endif if ( string == str ) return NULL; else return string; }