经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
带你用C语言实现strtok和字符串分割函数
来源:jb51  时间:2021/9/14 15:58:14  对本文有异议

前言

字符串分割函数strtok,大家可能都知道他怎么使用,一旦要用的时候就会心生疑惑,不知道它的内部的实现,废话不多说,本篇就来带大家看看strtok的基本使用和实现

一、strtok的基本使用

在这里插入图片描述

解析:函数大概说了以下几点

1.str就是我们要去拆分的字符串,注意,我们会对该字符串进行更改,所以一般我们会拷贝一份然后去分割拷贝的那份字符串!!

2.delimiters 就是我们定义的切分的符号,假如想要用空格作为分割符,我们就可以定义 char delimiters [NUM]=" " ** 请注意里面放了一个空格的呀!!
此处NUM可以自己定义大小,这里的delimiters 可以有多种分割方式。

3.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将会有一个设置保存他修改了的下一个位置的地址,如“wo ai ni”,其中若用空格作为分隔符就会将空格处换成*"\n"**,返回w的位置,并且函数内部保存a的位置。

4.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置(即上面所说的位置w)开始,查找下一个标记。

5.如果字符串中不存在更多的标记,则返回 NULL 指针。

分析完后我们看一段代码,对一段字符串做一个切割

  1. int main()
  2. {
  3. char a[] = "wo shi bo zhu";
  4. char* retArr[10];
  5. retArr[0] = strtok(a, " ");
  6. int i = 1;
  7. while (retArr[i++] = strtok(NULL, " "));
  8. for (int i = 0; i < 10; i++)
  9. {
  10. printf("%s ", retArr[i]);
  11. }
  12. return 0;
  13. }

在这里插入图片描述

二、strtok的实现

分析:进来的情况大致分为两种,str为空和不为空的情况,函数第一次调用的话因为我们要记录下一次进来时的位置,我们选择在函数内部创建一个static的静态变量,static char* p_last = NULL ,并且第一次我们设置为NULL,函数又分为两种情况,我们切割的话用tmp指针往后走,str指针保存当前位置,所以tmp指针走到\0时我们还要将p_last处理成NULL,其他的情况(str串还能被delimiters分隔)我们就在函数内部把*tmp = ‘\0',再将p_last处理为下一次进来的位置即可

例子:

  1. int main()
  2. {
  3. char a[] = "wo ai ni";
  4. char* retArr[10];
  5. retArr[0] = my_strtok(a, " ");
  6. int i = 1;
  7. while (retArr[i++] = my_strtok(NULL, " "));
  8. for (int i = 0; i < 10; i++)
  9. {
  10. printf("%s ", retArr[i]);
  11. }
  12. return 0;
  13. }

第一次分割

在这里插入图片描述

第二次分割

在这里插入图片描述

第三次分割

在这里插入图片描述

第四次切割

在这里插入图片描述

实现代码如下,有需要自取:

  1. char* my_strtok(char* str, char* delimiters)
  2. {
  3. //str传NULL的时候如果上次有记录,则用上一次的下一个位置,不然就为NULL
  4. static char* p_last = NULL;
  5. if (str == NULL && p_last == NULL)
  6. return NULL;
  7. if (str == NULL)
  8. {
  9. //用来返回的当前位置
  10. str = p_last;
  11. char* tmp = p_last;
  12. int len = strlen(delimiters);
  13. while (*tmp)
  14. {
  15. for (int i = 0; i < len; ++i)
  16. {
  17. if (*tmp == delimiters[i])
  18. {
  19. p_last = tmp+1;
  20. *tmp = '\0';
  21. return str;
  22. }
  23. }
  24. //走到这里表示当前的tmp没有在delimiters中能找到的
  25. tmp++;
  26. }
  27. //走到这里就是自己走到斜杠\0的位置,就要将p_last 设置成为NULL
  28. char* ret = p_last;
  29. p_last = NULL;
  30. return ret;
  31. }
  32. else
  33. {
  34. char* tmp = str;
  35. int len = strlen(delimiters);
  36. while (*tmp)
  37. {
  38. for (int i = 0; i < len; ++i)
  39. {
  40. if (*tmp == delimiters[i])
  41. {
  42. p_last = tmp+1;
  43. *tmp = '\0';
  44. return str;
  45. }
  46. }
  47. //走到这里表示当前的tmp没有在delimiters中能找到的
  48. tmp++;
  49. }
  50. //找到了,找不到
  51. char* ret = p_last;
  52. p_last = NULL;
  53. return ret;
  54. }
  55. }

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号