strtok_r

strtok_r

strtok_r()函式用於分割字元串。strtok_r是linux平台下的strtok函式的執行緒安全版。windows的string.h中並不包含它,windows下的對應安全函式為strtok_s。

基本介紹

  • 外文名:strtok_r
  • 作用:分割字元串
  • 含義:str為要分解的字元串
函式原型,套用,

函式原型

char *strtok_r(char *str, const char *delim, char **saveptr);
strtok_r函式是strtok函式的可重入版本。str為要分解的字元串,delim為分隔設定字元串。char **saveptr參數是一個指向char *的指針變數,用來在strtok_r內部保存切分時的上下文,以應對連續調用分解相同源字元串。
第一次調用strtok_r時,str參數必須指向待提取的字元串,saveptr參數的值可以忽略。連續調用時,str賦值為NULL,saveptr為上次調用後返回的值,不要修改。一系列不同的字元串可能會同時連續調用strtok_r進行提取,要為不同的調用傳遞不同的saveptr參數。
strtok_r實際上就是將strtok內部隱式保存的this指針,以參數的形式與函式外部進行互動。由調用者進行傳遞、保存甚至是修改。需要調用者在連續切分相同源字元串時,除了將str參數賦值為NULL,還要傳遞上次切分時保存下的saveptr。

套用

#include <stdio.h>#include <string.h>int main(void){  int j,in = 0;  char buffer[100] = "Fred male 25,John male 62,Anna female 16";  char *p[20];  char *buf = buffer;  char *outer_ptr = NULL;  char *inner_ptr = NULL;  while ((p[in] = strtok_r(buf, ",", &outer_ptr)) != NULL)  {    buf = p[in];    while ((p[in] = strtok_r(buf, " ", &inner_ptr)) != NULL)    {      in++;      buf = NULL;    }    buf = NULL;  }  printf("Here we have %d strings\n", in);  for (j = 0; j < in; j++)  {    printf(">%s<\n", p[j]);  }  return 0;}
調用strtok_r的代碼比調用strtok的代碼多了兩個指針,outer_ptr和inner_ptr。outer_ptr用於標記每個人的提取位置,即外循環;inner_ptr用於標記每個人內部每項信息的提取位置,即內循環。具體過程如下:
(1)第1次外循環,outer_ptr忽略,對整個源串提取,提取出"Fred male 25",分隔設定',' 被修改為了'\0’,outer_ptr返回指向'J’。
(2)第一次內循環,inner_ptr忽略對第1次外循環的提取結果"Fred male 25"進行提取,提取出了"Fred",分隔設定' '被修改為了'\0',inner_ptr返回指向'm'。

相關詞條

熱門詞條

聯絡我們