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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言strtok函数源码,C语言_strtok函数源代码分析及扩展

發布時間:2023/12/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言strtok函数源码,C语言_strtok函数源代码分析及扩展 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

今天在看strtok函數源碼時,發現有點繞,就將源碼的處理思想以圖示的方式展現給大家,希望可以幫助大家。

strtok函數

char *strtok( char *str1, const char *str2 );

str1為需要分割的字符串,首次傳入的是源字符串,后面就是NULL

str2為分隔符字符串,此字符串中的每個字符都是分割符

返回值:如果不存在分隔符,則返回NULL;存在則返回分割出的字符串的首地址,字符串首部不含分隔符,尾部是字符串結束符+余下的帶分割的字符串。

注意:此函數是在源字符串中進行分割操作,如不想修改源字符串,最好copy一份。

strtok函數源碼:

/*?Copyright?(C)?1994?DJ?Delorie,?see?COPYING.DJ?for?details?*/

#include?char*?strtok(char?*s,?const?char?*delim)

{

const?char?*spanp;

int?c,?sc;

char?*tok;

static?char?*last;

if?(s?==?NULL?&&?(s?=?last)?==?NULL)

return?(NULL);

/*

*?Skip?(span)?leading?delimiters?(s?+=?strspn(s,?delim),?sort?of).

* 跳過字符串首部的分隔符

*/

cont:

c?=?*s++;

for?(spanp?=?delim;?(sc?=?*spanp++)?!=?0;)?{

if?(c?==?sc)

goto?cont;

}

/*

*分割符后面沒有字符串了

*/

if?(c?==?0)?{?????????????????/*?no?non-delimiter?characters?*/

last?=?NULL;

return?(NULL);

}

tok?=?s?-?1; /*分割符后面還有字符串,將tok指向字符串首部(不包括分隔符)*/

/*

*?Scan?token?(scan?for?delimiters:?s?+=?strcspn(s,?delim),?sort?of).

*?Note?that?delim?must?have?one?NUL;?we?stop?if?we?see?that,?too.

* 循環字符串中的字符,直到找到分隔符或者結束符,并替換成結束符

*/

for?(;;)?{

c?=?*s++;

spanp?=?delim;

/*

*判斷字符串中的某字符是否是分割符中的字符

*如果是,將分隔符替換成結束符并返回tok;

*如果不是,繼續判斷下一個字符

*/

do?{

if?((sc?=?*spanp++)?==?c)?{

if?(c?==?0)

s?=?NULL;

else

s[-1]?=?0;

last?=?s;

return?(tok);

}

}?while?(sc?!=?0);

}

/*?NOTREACHED?*/

}

strtok函數思想圖示:

第一次:

第二次:

第三次:

最后一次:

處理思想:

1、在原字符串中進行分隔,找到第一個匹配的分隔符,將此字符替換為結束符0

2、tok為首個不是分隔符的字符,last為找到的第一個匹配的分隔符字符下一位字符位置(也就是下次循環開始位置)

3、下一次循環開始忽略所有分隔符的字符。找到首個不是分隔符的字符賦值給tok

驗證代碼

#include #include /*打印內存空間函數*/

void printBuff(char buff[],int len)

{

int num,numCount;

numCount=len;

for(num=0; num < numCount; num++)

{

printf("%x ",buff[num]);

}

printf("\n");

}

int main(int argc, char *argv[])

{

char str[50] = "123aaaaaa23bbbbbbbbb2ccccccccc";

char delimt[3] = "123";

char* result = NULL;

printBuff(str,50);/*打印str的內存空間*/

result = strtok(str,delimt);

while(result != NULL)

{

printf("%s\n",result);

result = strtok(NULL,delimt);

}

printBuff(str,50);/*打印str的內存空間*/

return 0;

}

輸出:

總結

以上是生活随笔為你收集整理的c语言strtok函数源码,C语言_strtok函数源代码分析及扩展的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。