最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

每日观点:浅谈strtok函数的原理与使用

来源:博客园

对于strok函数的理解,自己也是很迷茫,尤其看到有的范例将第一参数设为NULL也很是不解,也是找了许多博文,并看了官方的英文文档才浅显地理解了。这位前辈的博文对我启发很大。链接:https://blog.csdn.net/liuintermilan/article/details/6280816

函数原型:

//函数原型#include char *strtok(char *str, const char *delim);

函数功能为“Parse S into tokens separated by characters in DELIM.If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. ” 翻译成汉语就是:作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。


(资料图片仅供参考)

函数的返回值为子串的指针,即子串在源字符串中的起始位置。如果没有分隔的字符串则返回NULL

大家都知道strtok函数作用是用来分隔字符串,那他怎么分隔的做了些什么事呢。我的理解如下:

我们定义字符串与函数:

char buffer[32] = "qwe rty uio asd";char *p;p = strtok(buffer," ");

此时,如果我们输出buffer,为qwe.输出p为qwe. 这是因为经过strok函数buffer把第一个“ ”也就是空格替换成了‘\0’,也就是buffer[4] = "\0",其余位置不变,这就是为什么输出为qwe了。因此,使用strtok时一定要慎重,以防止源字符串被修改。

为什么strtok第一个参数能为NULL值?

这是因为每次调用结束前,strtok函数用一个this指针指向了我们设置的分解符的下一位,也就是"r",当参数为NULL时表示,表示继续从上一次this保存的位置,继续分隔字符串,至于为什么事NULL,可以参考strtok的源代码,使用的话只需记住结论就好。所以,将代码加上如下三行可以依次提取出rty,uio,asd.

char buffer[32] = "qwe rty uio asd";char *p;p = strtok(buffer," ");p = strtok(NULL," ");printf("%s\n",p);p = strtok(NULL," ");printf("%s\n",p);p = strtok(NULL," ");printf("%s\n",p);

以上printf输出依次为:rty,uio,asd.

也许有人会如果,我们偏不传NULL,就传源字符串会怎样呢?结果其实想得到,当第一次调用strtok的时候源字符串第四个字符“ ”空格已经被改为"\0"也就是NULL,所以,可见部分只剩下qwe,因此,结果肯定是找不到分解符“ ”。

分享到此告一段落,以下是使用strtok函数的注意事项:

1.strtok在调用的时候会忽略其实位置的分隔符,也就是说如果源字符串为:(qwe前多了个空格)

char buffer[32] = " qwe rty uio asd"

那么输出的结果还是"qwe".

2.不能向第一个参数传递字符串常量!

我在一次编程中定义源字符串为:

char *po = "qwe erty ui";

结果就报了段错误!

3.当设置第二个参数分隔符为字符串时,比如“asfd”,实际上是一个分隔符集合,相当于先以a为分隔符分隔。

关键词: 起始位置 这是因为 字符串常量