strtok函数源码(传入的第一个参数为什么不同)

16 篇文章 1 订阅

这篇文章是关于:

在看别人的代码时,遇到以下问题:为什么第一次使用strtok和 接下来每次使用strtok时 第一个参数分别传入 原字符串 和 null 的原因。

第一次:token = strtok(line, LSH_TOK_DELIM);
第二次及以后:token = strtok(NULL, LSH_TOK_DELIM);

strtok函数的源代码:

#include <string.h> /* strspn() strcspn() */
char *strtok(char * str, const char * delim)
{
    static char* p=0;
    if(str)
        p=str;
    else if(!p)
        return 0;
    str=p+strspn(p,delim);//1
    p=str+strcspn(str,delim);//2
    if(p==str)
        return p=0;
    p = *p ? *p=0,p+1 : 0;//3

	以下是对//3的翻译。
    /*if(*p){
    	*p='\0';//截断
    	p=p+1;//下一个字符串的第一个位置
    }else p=0;*/
    return str;
}

1:str为要 分出来的字符串 的第一个位置
2:p为 将要分出来的字符串 要截断的位置(把空格变成’\0’)
3:此处先判断p是否到达末尾。*p等于0的意思是在此截断,然后p=p+1,p的内存不变,所以下一次使用strtok函数时,第一个参数为null。

理解上面需要理解以下的内容:

static变量:一旦声明(无论声明的位置在哪里),即便函数结束,内存也不会销毁,只有整个程序结束才会销毁。

C语言strspn()函数:计算字符串str中连续有几个字符都属于字符串accept
size_t strspn(const char *str, const char * accept);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
	int i;
	char str[] = "129th";
	char accept[] = "1234567890";
	i = strspn(str, accept);
	printf("str 前 %d 个字符都属于 accept\n",i);
	system("pause");
	return 0;
}
结果 :str 前 3 个字符都属于 accept

C语言strcspn()函数:计算字符串str中连续有几个字符都不属于字符串accept
size_t strcspn(char *str, char *accept);

#include<stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
	char* s1 = "http://c.biancheng.net/cpp/u/biaozhunku/";
	char* s2 = "c is good";
	int n = strcspn(s1,s2);
	printf("The first char both in s1 and s2 is :%c\n",s1[n]); 
	printf("The position in s1 is: %d\n",n);
	system("pause");
	return 0;
}
结果是 :s1 is diffrent from s2!

关于C语言strspn()函数和C语言strcspn()函数的代码来源于下面:

C语言中strspn()函数和strcspn()函数的对比使用

看懂了点个赞,看不懂再看亿遍,其实不懂也没事,懂得怎么用,照猫画虎就可以了。
还行,本来还有点懵,写出来就懂了。
其实你还可以对着strtok函数,用一个例子(ni hao ya)照着我的思路来过一遍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值