日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

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

strtok函數(shù)

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

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

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

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

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

strtok函數(shù)源碼:

/*?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.

* 循環(huán)字符串中的字符,直到找到分隔符或者結(jié)束符,并替換成結(jié)束符

*/

for?(;;)?{

c?=?*s++;

spanp?=?delim;

/*

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

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

*如果不是,繼續(xù)判斷下一個字符

*/

do?{

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

if?(c?==?0)

s?=?NULL;

else

s[-1]?=?0;

last?=?s;

return?(tok);

}

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

}

/*?NOTREACHED?*/

}

strtok函數(shù)思想圖示:

第一次:

第二次:

第三次:

最后一次:

處理思想:

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

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

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

驗證代碼

#include #include /*打印內(nèi)存空間函數(shù)*/

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的內(nèi)存空間*/

result = strtok(str,delimt);

while(result != NULL)

{

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

result = strtok(NULL,delimt);

}

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

return 0;

}

輸出:

總結(jié)

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

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