strtok函数源码

本文探讨了strtok函数的工作原理,尤其是它如何处理多个字符串的连续调用。通过查看不同版本的源码,揭示了函数内部如何保存状态,以及其巧妙的设计。作者对库函数的实现表示赞赏,并详细解释了版本一和版本二的实现方式,以及第三个版本使用哈希实现的独特之处。
摘要由CSDN通过智能技术生成

今天用到strtok时,总感觉怪怪的,为啥第二次调用第一个参数要用NULL, 难道是函数内部保存了当前的状态,假如这样的话,那就不能对多个串交叉调用strtok了,而且保存这个状态的不是全局变量就是static变量。 于是看了他的源码,有几个不同的版本,思想是一样的。 感觉写的挺巧妙的,深深的折服这些写库函数的牛人了。 下面是源码

版本一

    char *s;            /* string to search for tokens */
    const char *delim;  /* delimiting characters */
{
    static char *lasts;
    register int ch;

    if (s == 0)
	s = lasts;
    do {
	if ((ch = *s++) == '\0')
	    return 0;
    } while (strchr(delim, ch));
    --s;
    lasts = s + strcspn(s, delim);
    if (*lasts != 0)
	*lasts++ = 0;
    return s;
}

上面用到了strcspn函数,这个函数返回值是n,表示s的前n个字符都没有在delim中出现。原理是这样的,函数在一开始判断第一个参数是不是空,假如是的话,也就是第二次调用这个函数了,那么把上一次的状态last赋值给要返回的串,然后那个do实现的功能其实就是strspn函数,这个函数的返回值是n,代表 s的前n个字符全部在delim出现。也就是说do实现的是跳过s中字符属于分隔符

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值