字符串分割函数strtok(会改变原字符串)

本文详细解析C++中的字符串分割函数strtok(),包括其头文件、函数原型、参数、返回值及注意事项。通过两个实例演示如何使用strtok()分割单个和多个字符,展示分割过程对字符串的影响。

字符串分割函数strtok():

头文件:#include <cstring>

函数原型:char *strtok(char *str, const char *delimiters);

函数功能:分割字符串,将str分割成一个个子串

函数参数:

       str: 在第一次被调用的时候str传入需要被分割字符串的首地址;在后面调用的时候传入NULL。

       delimiters: 表示分割字符串中包含的所有字符。

函数返回值:

       当s中的字符查找到末尾时,返回NULL;

       如果查不到delimiters所标示的字符,则返回当前strtok的字符串的指针。

需要注意的是:使用该函数进行字符串分割时,会破坏并分解字符串的完整,调用前和调用后的str已经不一样了。strtok在切割字符串的时候,实际上就是将分割符的字符delimiter替换为'\0'并且返回首地址。这点在下面会有例子说明。

 

例一:分割单个字符

(1)将字符串通过'@'分割开:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	char str[] = "@I am@a great@young man@!";
	char *temp = strtok(str, "@");
	while (temp)
	{
		cout << temp << endl;
		temp = strtok(NULL, "@");
	}

	return 0;
}

运行结果:

       I am
       a great
       young man
       !

(2)下面我们来观察一下调用strtok()函数之后的str会是什么样的:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	char str[] = "@I am@a great@young man@!";
	char *temp = strtok(str, "@");
	while (temp)
	{
		cout << temp << endl;
		temp = strtok(NULL, "@");
	}
	
	for (int i = 0; i < sizeof(str); i++)
		cout << str[i];
	return 0;
}

我们发现调用完strtok函数后再输出的完整的str是:

       @I am a great young man !

例一总结:strtok在分割字符串的过程,实际上就是将被分割的字符串的分割字符替换为'\0' 并且返回标记字符串的首地址,直到返回NULL结束。调用完strtok后,如果只是直接输出str,而不是像上面一样将所有的字符都输出,则输出的是@I am。但需要注意的是,此处有点特殊,因为有一个分割符在字符串首位,所以第一个@没被替换,后面的@全部被替换;但如果第一位不是分割字符,则后面的分割符也是全部被替换为'\0',而不是第一个分割符不被替换。

 

例二:分割多个字符

将字符串通过'@'和'!'分割开:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	char str[] = "I!am@a!great@young!man.!";
	char *temp = strtok(str, "@!");
	while (temp)
	{
		cout << temp << endl;
		temp = strtok(NULL, "@!");
	}
	
	return 0;
}

可以看出,只需要将分割字符全部放到一个字符串里即可,如"@!"。

 

参考:http://www.cnblogs.com/Bob-tong/p/6610806.html

           https://blog.csdn.net/jiangqin115/article/details/48545895

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CarreLiu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值