前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >strtok字符串分割函数

strtok字符串分割函数

作者头像
大忽悠爱学习
发布2021-03-02 14:45:05
1.4K0
发布2021-03-02 14:45:05
举报
文章被收录于专栏:c++与qt学习

函数原型:

函数原型:char *strtok(char *s, char *delim)

代码语言:javascript
复制
     功能:作用于字符串s,以delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。
     
     返回值:分隔符匹配到的第一个子串

注意:

1.函数的作用是分解字符串,所谓分解,即没有生成新串,只是在s所指向的内容首次出现分界符的位置,将分界符修改成了’/0’,故第一次用strtok()返回第一个子串,源字符串会发生变化

2. 第一次提取子串完毕之后,继续对源字符串s进行提取,应在其后(第二次,第三次。。。第n次)的调用中将strtok的第一个参数赋为空值NULL(表示函数继续从上 一次调用隐式保存的位置,继续分解字符串;对于前一次次调用来说,第一次调用结束前用一个this指针指向了分界符的下一位)

3.当this指针指向“\0” 时,即没有被分割的子串了,此时则返回NULL

4. 可以把delim理解为分隔符的集合,delim中的字符均可以作为分隔符。

5、strtok在调用的时候,如果起始位置即为分隔符,则忽略了起始位置开始的分隔符

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//strtok字符串分割
void test()
{
  //源字符串
	char buffer[128] = "hello the world! it is so good a day! l feel very happy";
	//数组中存放为字符串指针,即每个元素都是指针,指针是字符串类型的
	//指针就是地址,所以数组中也可以存放字符串首地址
	char* buf[4] = { NULL };
	buf[0]=strtok(buffer, "!");
	printf("原字符串在第一次切割后=%s\n", buffer);
	int i = 0;
	while (buf[++i] = strtok(NULL, "!")) {
		printf("%d\n", i);
	}
	for (int i = 0; i < 3; i++)
	{
		printf("%s ", buf[i]);
	}
}
int main()
{
	test();
	return 0;
}

代码优化版本:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//strtok字符串分割
void test()
{
  //源字符串
	char buffer[128] = "hello the world! it is so good a day! l feel very happy";
	//数组中存放为字符串指针,即每个元素都是指针,指针是字符串类型的
	//指针就是地址,所以数组中也可以存放字符串首地址
	char* buf[4] = { buffer,NULL };
	int i = 0;
	//strtok第一个参数第一次循环是buffer数组,第二次循环为NULL,隐形返回上次分割的位置
	while(buf[i++]=strtok(buf[i],"!")){}
	for (int i = 0; i < 3; i++)
	{
		printf("%s ", buf[i]);
	}
}
int main()
{
	test();
	return 0;
}

分割符有多个的情况:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//strtok字符串分割
void test()
{
  //源字符串
	char buffer[128] = "hello *the world! it is &so good a day! l feel very happy";
	//数组中存放为字符串指针,即每个元素都是指针,指针是字符串类型的
	//指针就是地址,所以数组中也可以存放字符串首地址
	char* buf[64] = { buffer,NULL };
	int i = 0;
	//strtok第一个参数第一次循环是buffer数组,第二次循环为NULL,隐形返回上次分割的位置
	while(buf[i++]=strtok(buf[i],"*!&")){}
    int j = 0;
	while (buf[j] != NULL)
	{
		printf("%s ", buf[j++]);
	}
}
int main()
{
	test();
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档