函数原型:
函数原型:char *strtok(char *s, char *delim)
功能:作用于字符串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在调用的时候,如果起始位置即为分隔符,则忽略了起始位置开始的分隔符
#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;
}
代码优化版本:
#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;
}
分割符有多个的情况:
#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;
}