【C语言】字符和字符串函数(2)-五、strtok函数的使用

时间:2024-10-01 12:07:08

   这也是一个新函数,它的作用是什么呢?它可以按照我们给出的分隔符来分割我们的字符串,现在我们先来了解一下它的原型:

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也就等于空指针了,此时用来退出循环刚好
   这个代码是不是非常巧妙呢?可能有些同学会说这种代码想不到,确实,如果没有见识过这种代码,那么确实很难想到,但是我们学习编程的过程就是模仿,模仿这些好的代码,记在心里,以后这个代码就是你的了,也就不存在想不出来的问题了