极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19013|回复: 1

Arduino Strtok函数小心得

[复制链接]
发表于 2015-8-21 12:41:41 | 显示全部楼层 |阅读模式
x=strtok(data,” ,”);
该函数的作用是进行字符串的分割,第一个参数是字符串数据,第二参数是分割符,分割符必须在双引号内。
该函数的操作过程:
假设data里面的数据是”abc,jjj,ooo”,我们想要提取出里面三个数据出来,那么我们就需要将字符串进行分割。
首先第一步是给data赋值,让它拥有abc,jjj,ooo这些字符;
下一步我们调用strtok函数,函数会第一步将data的字符传入到一个缓存区中,然后利用三个指针进行字符串的扫描。三个指针分别是:1:第一个不是分割符的字符地址;2:第一个分割符的地址;3:在分割符之后,第一个不是分割符的字符的地址。
通过这三个指针就可以开始进行字符的第一步分割了,例如:
x=strtok(data,” ,”);
这一步会得到一个字符串abc,然后函数内的3个指针分别是”a”的地址,”,”的地址,和”j”的地址。
再下一步,我们还需要进行分割,这个时候我们不需要再给strtok函数传入字符数据,因为在该函数内部已经存取有了一个进行过一次分割后的字符串。
这个时候我们给函数的第一个参数写一个NULL就可以了,代表我没有数据给你,你就用剩下的数据就可以了。例如:
x=strtok(NULL,” ,”);
这个时候,该函数会调用之前进行操作过后的指针,将第三个指针(也就是”j”的地址)赋予给现在的第一个指针,然后将第二个指针的地址指向下一个分割符号(下一个”,”的地址)的地址,第三个指针的地址指向下一个分割符号过后的第一个不是分割符的字符(也就是”o”的地址)。所以这个时候我们的x的值就是jjj。
然后我们再进行一次同样的操作,这个时候第一个指针就变成了”o”,但是没有下一个分割符号了,所以我们第二个指针返回一个NULL值,第三个指针也是返回的NULL值。
现在我们x的值就变成了ooo了。
这个时候我们的字符串已经分割完毕了,但是在程序里面,我们一般都是通过一个条件判断来进行的,所以我们现在在做最后一次的操作,再调用一次这个函数。这个时候因为上一次中,第三个指针为NULL,所以现在给x返回一个NULL值,然后现在的三个函数内的指针都变成了NULL值了。现在我们当我们判断x的值为NULL时,我们的循环就可以停止了。

总结一下:
我们给一个小小的程序:
x=strtok(data,” ,”);
while(x!=NULL){
a=x;
x=strtok(NULL,”,”);
}

在这个函数中,data=”abc,jjj,ooo”,此while循环会循环4次:
第一次:
x=”abc”
a=”abc”
第二次:
x=”jjj”
a=”jjj”
第三次:
x=”ooo”
a=”ooo”
第四次:
x=NULL
然后不会执行循环内的函数了。


以上的程序只是一个简单的程序,不是一个完整的正确的程序,只供理解用。
回复

使用道具 举报

发表于 2015-8-21 13:29:10 | 显示全部楼层
这种可以确定,比如标准库函数的用法,还是参考官方的文档比较好罢。。
这里面有strtok函数的用法:http://www.cplusplus.com/reference/cstring/strtok/
在avr libc的实现里面除了strtok还实现了一个可重入的版本strtok_r,官方文档在:http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga6ace85338eafe22a0ff52c00eb9779b8
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 21:07 , Processed in 0.051556 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表