这也是一个新函数,它的作用是什么呢?它可以按照我们给出的分隔符来分割我们的字符串,现在我们先来了解一下它的原型:
char * strtok ( char * str, const char * sep);
它的第一个参数就是一个带有分隔符的字符串的首地址,而第二个参数就是装有分隔符的字符串的首地址,strtok函数就可以根据我们给出的分隔符将字符串分隔开来
在分隔一次过后,它会返回这个被分隔下来的字符串的首地址,要注意一个点:在使用函数时,strtok会修改数组的内容,把分隔符改成\0,所以一般会创建源数据的副本,然后用副本使用这个函数,并且调用一次这个函数只会分隔一个分隔符,如果有多个分隔符就要多次调用
并且第一次分隔传参时,第一个参数为要分隔的字符串的地址,而第二次及以后传参时,第一个参数只需要传一个空指针NULL,它就可以帮我们接着上一次分隔继续分隔
如果分隔完毕,没有任何分隔符了,那么函数就会返回一个空指针来提醒我们,这就是函数strtok的基本功能
接下来我们来总结一下它的特点:
- sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
- 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记
- strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改)
- strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置 - strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记
- 如果字符串中不存在更多的标记,则返回 NULL 指针
接下来我们来学习如何使用这个函数,我们可以举一个例子,比如我们的邮箱由两个分隔符分隔开来,就是@符合和(.)点号,我们想把这个邮箱地址分隔开来可以这样操作:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "TANGLONG222@163.com";
char arr2[] = "@.";
char* ret1 = strtok(arr1, arr2);
char* ret2 = strtok(NULL, arr2);
char* ret3 = strtok(NULL, arr2);
printf("%s\n%s\n%s\n", ret1, ret2,ret3);
return 0;
}
我们来看看运行结果:
可以看到我们成功把这个邮箱分成了三个部分,但是有一个问题,这里有两个分隔符我们就写了三行代码,并且打印时也很麻烦,如果有n个分隔符呢?就会很麻烦,我们可以采取以下的办法:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "TANGLONG222@163.com";
char arr2[] = "@.";
char* p = NULL;
for (p = strtok(arr1, arr2); p != NULL; p = strtok(NULL, arr2))
{
printf("%s\n", p);
}
return 0;
}
我们利用for循环初始化只进行一次的技巧来调用第一次的strtok,并且将它赋值给p指针,随后我们调用strtok的第一个参数就只需要传空指针,就可以写在循环的调整部分
而中间的循环结束条件为什么设置为不等于NULL呢?因为当我们的字符串分隔完毕,没有分隔符后,函数就会返回一个空指针,p也就等于空指针了,此时用来退出循环刚好
这个代码是不是非常巧妙呢?可能有些同学会说这种代码想不到,确实,如果没有见识过这种代码,那么确实很难想到,但是我们学习编程的过程就是模仿,模仿这些好的代码,记在心里,以后这个代码就是你的了,也就不存在想不出来的问题了