#include<stdio.h> #include<string.h> //根據(jù)函數(shù)原型實(shí)現(xiàn)strtok()函數(shù) char* myStrtok_origin(char* str_arr,constchar* delimiters,char**temp_str) { //定義一個(gè)指針來指向待分解串 char*b_temp; /* * 1、判斷參數(shù)str_arr是否為空,如果是NULL就以傳遞進(jìn)來的temp_str作為起始位置; * 若不是NULL,則以str為起始位置開始切分。 */ if(str_arr == NULL) { str_arr =*temp_str; } //2、跳過待分解字符串 //掃描delimiters字符開始的所有分解符 str_arr += strspn(str_arr, delimiters); //3、判斷當(dāng)前待分解的位置是否為'\0',若是則返回NULL,否則繼續(xù) if(*str_arr =='\0') { return NULL; } /* * 4、保存當(dāng)前的待分解串的指針b_temp,調(diào)用strpbrk()在b_temp中找分解符, * 如果找不到,則將temp_str賦值為待分解字符串末尾部'\0'的位置, * b_temp沒有發(fā)生變化;若找到則將分解符所在位置賦值為'\0', * b_temp相當(dāng)于被截?cái)嗔?,temp_str指向分解符的下一位置。 */ b_temp = str_arr; str_arr = strpbrk(str_arr, delimiters); if(str_arr == NULL) { *temp_str = strchr(b_temp,'\0'); } else { *str_arr ='\0'; *temp_str = str_arr +1; } //5、函數(shù)最后部分無論找沒找到分解符,都將b_temp返回。 return b_temp; } //使用myStrtok來簡化myStrtok_origin函數(shù) char* myStrtok(char* str_arr,constchar* delimiters) { staticchar*last; return myStrtok_origin(str_arr, delimiters,&last); } int main(void) { char buf[]="hello@boy@this@is@heima"; //1、使用myStrtok_origin()函數(shù) char*temp_str = NULL; char*str = myStrtok_origin(buf,"@",&temp_str); while(str) { printf("%s ",str); str = myStrtok_origin(NULL,"@",&temp_str); } //2、使用myStrtok()函數(shù) char*str1 = myStrtok(buf,"@"); while(str1) { printf("%s ",str1); str1 = myStrtok(NULL,"@"); } return0; } |
|