一、strtok
的使用
函数原型:char *strtok(char *s, char *delim)
先把测试代码放上;
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int main()
{
char str[] = "aaa bbb ccc ddd";
char pattern[] = " ";
char *res = strtok(str, pattern);
while (res != NULL)
{
printf("%s\n", res);
res = strtok(NULL, pattern);
}
return 0;
}
基本上这个函数就是这么用的,然后解释一下为什么这个函数这么用:
首先:char *res = strtok(str, pattern);
为什么放这样一句在这儿,返回值又是什么东西?这是值得学习的,在使用完这句话后,原来的字符串会发生一些改变:在这句话执行完毕之后,原来的字符串str
发生了改变,因为该方法首先去找在str
中跟pattern
适配的字符 (空格),然后将第一个空格修改为了'/0'
,然后返回的字符串res
实际上就等于"aaa\0"
。
然后,在循环体while
中,res = strtok(NULL, pattern);
然后这里strtok
方法的第一个参数一定要放NULL
,至于为什么要放NULL,这里就不深深究了,具体想了解的去看源码吧。
注意点:
- 使用该函数会对原来的字符串进行修改,所以不能在
strtok
函数的第一个参数中传一个字符常量! - 注意该函数的匹配项的使用原则:一般来说,匹配项
pattern
一般只是一个符号,如果出现多个符号,就极有可能出错,原因是:包含在pattern中的字符均可以作为分隔符,而非严格匹配。可以把pattern理解为分隔符的集合。 - 如果字符串第一个就是匹配项,如
src = ",aaa,bbb,ccc";
,pattern = ","
,那么strtok
在使用的时候会自动跳过第一个匹配项,从字符串后一位开始匹配
本文主要参考博主:关于函数strtok和strtok_r的使用要点和实现原理(一)