日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

strtok

發(fā)布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 strtok 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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,則函數(shù)保存的指針SAVE_PTR在下一次調(diào)用中將作為起始位置。

#include<stdio.h> #include<string.h> #define MAPSIZE 32 /* *功能:作用于字符串_String,以包含在_Delimiter中的字符為分界符,將_String切分成一個個子串; 如果,_String為空值NULL,則函數(shù)保存的static指針SAVE_PTR在下一次調(diào)用中將作為起始位置。 參數(shù): _String:指向欲分割的字符串;在第一次調(diào)用時,strtok()必需給予參數(shù)_String字符串,往后的調(diào)用則將參數(shù)_String設(shè)置成NULL;_Delimiter:為分隔符字符(如果傳入字符串,則傳入的字符串中每個字符均為分割符)。 特點:strtok函數(shù)會破壞待分解字符串的完整性,調(diào)用前和調(diào)用后的_String已經(jīng)不同。 */ char* __cdecl MyStrtok(char * _String, const char * _Delimiter) {//ASCII值是[0,255];故而要進(jìn)行無符號類型的強(qiáng)轉(zhuǎn)。unsigned char *str;const unsigned char *ctrl = (const unsigned char *)_Delimiter;static unsigned char* SAVE_PTR = NULL; //如果_String為空值NULL,則函數(shù)保存的指針SAVE_PTR在下一次調(diào)用中將作為起始位置unsigned char map[MAPSIZE]; memset(map, 0, sizeof(char)*MAPSIZE); //初始化標(biāo)記數(shù)組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,如果出現(xiàn)為NULL時,必定是else語句中的SAVE_PTR==NULL導(dǎo)致的;//SAVE_PTR始終指向上一次切割好的子串的結(jié)束符'\0'的下一位置,//如果SAVE_PTR == NULL,說明,主串遍歷結(jié)束//警告:對空指針進(jìn)行解引用是會崩潰的!!!//下行出現(xiàn)的if循環(huán)正常情況下并不起眼,//strtok函數(shù)到底調(diào)用幾次是使用者控制的,如果字符串切割完成之后還繼續(xù)調(diào)用呢???//必須終止!!!if(NULL == str) return NULL;//所有_Delimiter中包含的字符都會被濾掉,并將被濾掉的地方設(shè)為一處分割的節(jié)點。while ( (map[*str >> 3] & (1 << (*str & 7))) && *str ) str++;_String = (char *)str;//_String指向不包含在_Delimiter中的首個字符出現(xiàn)的位置----精華之處for (; *str; str++){if ( map[*str >> 3] & (1 << (*str & 7)) )//掃描過程中發(fā)現(xiàn)_Delimiter中包含的分割字符時,則會將該字符改為'\0' {*str++ = '\0'; //后續(xù)讀取的時,遇到'\0'就停止;意味著破壞_String指向的字符串是不可避免的,充當(dāng)結(jié)束符的角色break;}}SAVE_PTR = str; //記下又一次出現(xiàn)_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下運(yùn)行結(jié)果

?

總結(jié)

以上是生活随笔為你收集整理的strtok的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。