这篇文章是关于:
在看别人的代码时,遇到以下问题:为什么第一次使用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)照着我的思路来过一遍。