c语言strtok函数源码,C语言_strtok函数源代码分析及扩展
2019獨(dú)角獸企業(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ù)是在源字符串中進(jìn)行分割操作,如不想修改源字符串,最好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、在原字符串中進(jìn)行分隔,找到第一個匹配的分隔符,將此字符替換為結(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中考物理化学能用计算机吗,中考物理化学总
- 下一篇: 联想E440打开VT(虚拟化)