strtok
Parse S into tokens separated by characters in DELIM.? If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point.??作用于字符串s,以包含在delim中的字符為分界符,將s切分成一個個子串;如果,s為空值NULL,則函數保存的指針SAVE_PTR在下一次調用中將作為起始位置。
#include<stdio.h> #include<string.h> #define MAPSIZE 32 /* *功能:作用于字符串_String,以包含在_Delimiter中的字符為分界符,將_String切分成一個個子串; 如果,_String為空值NULL,則函數保存的static指針SAVE_PTR在下一次調用中將作為起始位置。 參數: _String:指向欲分割的字符串;在第一次調用時,strtok()必需給予參數_String字符串,往后的調用則將參數_String設置成NULL;_Delimiter:為分隔符字符(如果傳入字符串,則傳入的字符串中每個字符均為分割符)。 特點:strtok函數會破壞待分解字符串的完整性,調用前和調用后的_String已經不同。 */ char* __cdecl MyStrtok(char * _String, const char * _Delimiter) {//ASCII值是[0,255];故而要進行無符號類型的強轉。unsigned char *str;const unsigned char *ctrl = (const unsigned char *)_Delimiter;static unsigned char* SAVE_PTR = NULL; //如果_String為空值NULL,則函數保存的指針SAVE_PTR在下一次調用中將作為起始位置unsigned char map[MAPSIZE]; memset(map, 0, sizeof(char)*MAPSIZE); //初始化標記數組do {//所有_Delimiter中包含的字符都會被做記號 或等于map[*ctrl >> 3] |= (1 << (*ctrl & 7)); //*ctrl>>3等效于*str/8;*ctrl&7等效于*ctrl%8。} while (*ctrl++);if (_String != NULL)str = (unsigned char *)_String; //第一次才滿足if條件。elsestr = (unsigned char *)SAVE_PTR;//討論:str ?= NULL,如果出現為NULL時,必定是else語句中的SAVE_PTR==NULL導致的;//SAVE_PTR始終指向上一次切割好的子串的結束符'\0'的下一位置,//如果SAVE_PTR == NULL,說明,主串遍歷結束//警告:對空指針進行解引用是會崩潰的!!!//下行出現的if循環正常情況下并不起眼,//strtok函數到底調用幾次是使用者控制的,如果字符串切割完成之后還繼續調用呢???//必須終止!!!if(NULL == str) return NULL;//所有_Delimiter中包含的字符都會被濾掉,并將被濾掉的地方設為一處分割的節點。while ( (map[*str >> 3] & (1 << (*str & 7))) && *str ) str++;_String = (char *)str;//_String指向不包含在_Delimiter中的首個字符出現的位置----精華之處for (; *str; str++){if ( map[*str >> 3] & (1 << (*str & 7)) )//掃描過程中發現_Delimiter中包含的分割字符時,則會將該字符改為'\0' {*str++ = '\0'; //后續讀取的時,遇到'\0'就停止;意味著破壞_String指向的字符串是不可避免的,充當結束符的角色break;}}SAVE_PTR = str; //記下又一次出現_Delimiter中包含的字符的起始位置;return _String; }int main() {char str[] = { "192.168.0.10" };char *res[4] = { '\0'};res[0] = MyStrtok(str, ".");for (int i = 1; i < 4; ++i)res[i] = MyStrtok(NULL, ".");for (int i = 0; i < 4; ++i)printf("%s ", res[i]);printf("\n");return 0; } 圖1? VS2017下運行結果?
總結
- 上一篇: ai描边工具怎么打开_AI的工具栏怎么用
- 下一篇: STM32F103移相全桥PWM寄存器实