详解比较古怪的字符串拆分函数:strtok函数

对于字符串中的标点符号,字符呀!!如何能够当作分隔符来对原字符串进行分割呢??分割出来的为一段一段的字符……因此,在这里面就用到了:本文:比较古怪的字符串拆分函数:strtok函数!!

假设:对于这个字符串:woaini@wangyijun.com  我们将“@ . "当作分隔符,来进行打印三个字符串!"woaini"  "wangyijun" "com"  在这里面strtok函数,就起到了至关重要的地步!!

对于strtok函数我们在使用之前需要知道一下几点:

strtok函数的用法为:

           char * strtok ( char * str, const char * sep )

1.在这个函数内部:sep参数是个字符串,定义了用作分隔符的字符集合!!”@ ."

2.第一个参数str指定一个字符串,它包含了由0个或者多个由sep 字符串中的一个或者多个分隔符分割的标记!!如:woaini@wangyijun.com 

3.strtok函数找到str中的一个标记,并将其用'\0'结尾,返回一个指向这个标记的指针(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容,并且可修改)

4.strtok函数的第一个参数不为:NULL,函数将找到str中的第一个标记,strtok函数将保存他在字符串中的位置

5.strtok函数的第一个参数为NULL,函数将在同一字符串中被保存的位置开始,查找下一个标记处!!

6.如果字符串不存在更多的标记,则返回NULL

下面请看笔者的使用代码::

//从woaini@wangyijun.com中打印出:“woaini" "wangyijun" "com"

#include <stdio.h>
#include <string.h>

int main()
{
	char arr[] = "woaini@wangyijun.com";
	char buf[50] = { 0 };
	strcpy(buf, arr);  //将arr拷贝到buf
	//将arr拷贝到buf

	const char* p = "@.";   //定义分隔符!
	char* str = strtok(buf, p);
	printf("%s\n", str);

	str = strtok(NULL, p);
	printf("%s\n", str);


	str = strtok(NULL, p);
	printf("%s\n", str);
//后面要是再接着要写一个,会打印NULL(空指针)
}

再上面的函数代码中:

1.首先,我们定义了一个其他的数组,用来存放拷贝的arr数组!!

2.对于: str = strtok(NULL, p);    printf("%s\n", str);   在上面的代码中:传了个NULL(空指针),对于为什么这样进行,请参考上面的内容第4/5条!!该strtok函数有记忆功能,会记住位置!!

3.其实对于该函数的实现功能在调试的过程中,最容易显现出来过程,下面请看笔者的代码调试过程:

初始状态下的arr与buf数组的初始状态:

 通过strcpy(buf, arr);  //将arr拷贝到buf  结果为:

 想必这个过程,在之前看过笔者文章或者有过strcpy字符串拷贝函数知识的各位老铁,会是显而易见的答案!!这样就在buf函数内部进行切割就可以了!!

此时在str记录的是'w'的位置处的地址!在接着进入下一次切割

 虽然传入的是NULL(空指针)但是,由于strtok函数会记录位置,所以,仍然会正确的进行切分!!再接着进行……

 此时的str指向‘c’处的位置!!

在每次都能通过 printf("%s\n", str);  将其打印出来,所以就能实现字符串切割的目的了!

代码的运行结果为:

但是,多写了一次: str = strtok(NULL, p);   printf("%s\n", str);  将会有着以下的打印情况:

 对于上述的代码其实也可以用for循环来实现:笔者的实现过程为:(仅供参考)

#include <stdio.h>
#include <string.h>

int main()
{
	char arr[] = "woaini@wangyijun.com";
	char buf[25] = { 0 };
	strcpy(buf, arr);
	const char* p = "@.";

	for (char* str = strtok(buf, p); str != NULL; str = strtok(NULL, p))
	{
		printf("%s\n", str);
	}
	return 0;
}

在这个for循环内部,不用关注分割多少次!!所以显得比刚才的那个代码更加人性化!!

代码的运行结果也是一样的:

 本文就到次结束了先!!各位老铁若有不懂得问题,请及时私聊呀!!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念君思宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值