c语言函数记一串字母的源代码,C语言_strtok函数源代码分析及扩展

今天在看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函数思想图示:

第一次:

3336f2c4071dfe22221869ac5411c33a.png

第二次:

924888a5b5aceffc190b3780781eb353.png

第三次:

589c4da5544bb77d2bdb04d24bc3a51f.png

最后一次:

e1fe6c5f50b5f7869670f6fd64005d37.png

处理思想:

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;

}

输出:

c73e75e7f0fc077d1918cfd0b621ea23.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值