对于strok函数的理解,自己也是很迷茫,尤其看到有的范例将第一参数设为NULL也很是不解,也是找了许多博文,并看了官方的英文文档才浅显地理解了。这位前辈的博文对我启发很大。链接:https://blog.csdn.net/liuintermilan/article/details/6280816
函数原型:
//函数原型 #include <string.h> 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为分隔符分隔。
标签:函数,strtok,buffer,qwe,char,字符串,NULL,浅谈 From: https://www.cnblogs.com/hetaoBlog/p/17135667.html