strtok函数及其模拟
生活随笔
收集整理的這篇文章主要介紹了
strtok函数及其模拟
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.strtok函數(shù)的參數(shù)和返回值
參數(shù):第一個(gè)參數(shù)指定一個(gè)字符串,它包含了0個(gè)或者多個(gè)由del字符串中一個(gè)或者多個(gè)分隔符分割的標(biāo) 記。
第二個(gè)參數(shù)del參數(shù)是個(gè)字符串,定義了用作分隔符的字符集合。
返回值:
如果找到分割符號(hào),則指向分隔符號(hào)開頭的指針。
否則為空指針。
當(dāng)在正在掃描的字符串中到達(dá)字符串的末尾(即空字符)時(shí),始終返回空指針。
2.VS庫(kù)函數(shù)中的實(shí)現(xiàn)
extern "C" char* __cdecl __acrt_strtok_s_novalidation(_Inout_opt_z_ char* string,_In_z_ char const* control,_Inout_ _Deref_prepost_opt_z_ char** context);extern "C" char* __cdecl strtok(char* const string, char const* const control) {return __acrt_strtok_s_novalidation(string, control, &__acrt_getptd()->_strtok_token); }3.strtok函數(shù)的使用
我們常常通過循環(huán)的方式來進(jìn)行多次切割而得到想要的片段
以下是切割不當(dāng)?shù)腻e(cuò)誤示范
#define _CRT_SECURE_NO_WARNINGS 1 #include<string.h> #include<stdio.h>int main() {char arr1[] = "awsas%bda&adbajb*jwdjbsas@ahdb.awwqd";char arr2[40];//char arr2[] = "awsas%bda&adbajb*jwdjbsas@ahdb.awwqd";strcpy(arr2, arr1);char del[] = "%&*@.";char* p = arr1;p = strtok(arr2, del);while (p!=NULL){p = strtok(NULL, del);printf("%s\n", p);}}這是正確的寫法
#define _CRT_SECURE_NO_WARNINGS 1 #include<string.h> #include<stdio.h>int main() {char arr1[] = "awsas%bda&adbajb*jwdjbsas@ahdb.awwqd";char arr2[40];//char arr2[] = "awsas%bda&adbajb*jwdjbsas@ahdb.awwqd";strcpy(arr2, arr1);char del[] = "%&*@.";char* p = arr1;for(p = strtok(arr2, del);p!=NULL;p=strtok(NULL,del)){printf("%s\n", p);}}4.strtok函數(shù)的模擬
在進(jìn)行模擬之前我們先思考一個(gè)問題,,為什么每次函數(shù)被調(diào)用的時(shí)候,我們明明后續(xù)傳入的是一個(gè)空指針,但是為什么卻能夠找到上一次保存的地址,c語言中有什么地方提供了這樣的可能呢?沒錯(cuò),那就是靜態(tài)變量。
4.1使用庫(kù)函數(shù)
#include<stdio.h> #include<assert.h> #include<string.h> char* my_strtok(char* str1, const char* str2) {assert(str2);static int sz1 = NULL;static int count = NULL;static char* s1 = NULL;static char* s2 = NULL;int sz = 0;if (str1 != NULL){sz1 = strlen(str1);s2 = str1;sz = strlen(str2);for (*str1; *str1 != 0; str1++){ for (int i = 0; i < sz; i++){ if (i == 0){count++;}if (*str1 == *(str2 + i)){*str1 = 0;s1 = str1;//記錄這一次置0的位置。return s2;} }}}else{s2 = s1+1; str1 = s2;sz = strlen(str2);for (*str1; *str1 != 0; str1++){ for (int i = 0; i < sz; i++){ if (i == 0){count++;}if (*str1 == *(str2 + i)){*str1 = 0;s1 = str1;return s2;} }}if (count > sz1){return NULL;}return s2;}} int main() {char arr[20] = "adawa@wew%emm";char* p = "@%";char* str = NULL;for (str = my_strtok(arr, p); str != NULL; str = my_strtok(NULL, p)){printf("%s\n", str);}return 0; }4.2或者不使用庫(kù)函數(shù)進(jìn)行實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1 #include<string.h> #include<stdio.h> char* my_strtok(char* des, char* del) {char *des2 = des;char *del2= del;static char* p1 = NULL;char* des3=NULL ;if (des != NULL){for (; *des2; des2++){del2 = del;for (; *del2; del2++){if (*del2 == *des2){*des2 = '\0';p1 = des2;p1++;return des;}}}}else{//des3 = p1;for (; *p1; p1++){del2 = del;for (; *del2; del2++){if (*del2 == *p1){*p1 = '\0';p1++;return des3;}}}}return NULL; } int main() {char arr1[] = "s&a%d&WAEA&HAHA";char arr2[40];//char arr2[] = "awsas%bda&adbajb*jwdjbsas@ahdbawwqd";strcpy(arr2, arr1);char del[] = "%&";char* p = arr1;//for(p = strtok(arr2, del);p!=NULL;p=strtok(NULL,del))//{// printf("%s\n", p);//}for(p = my_strtok(arr2, del);p!=NULL;p=my_strtok(NULL,del)){printf("%s\n", p);} }總結(jié)
以上是生活随笔為你收集整理的strtok函数及其模拟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微管理:给你一个技术团队,你该怎么管札记
- 下一篇: Cadence 17.2 焊盘制作指南