带你用C语言实现strtok和字符串分割函数
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
前言
字符串分割函数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 2 3 4 5 6 7 8 9 10 11 12 13 | int main() { char a[] = "wo shi bo zhu" ; char * retArr[10]; retArr[0] = strtok (a, " " ); int i = 1; while (retArr[i++] = strtok (NULL, " " )); for ( int i = 0; i < 10; i++) { printf ( "%s " , retArr[i]); } return 0; } |
二、strtok的实现
分析:进来的情况大致分为两种,str为空和不为空的情况,函数第一次调用的话因为我们要记录下一次进来时的位置,我们选择在函数内部创建一个static的静态变量,static char* p_last = NULL ,并且第一次我们设置为NULL,函数又分为两种情况,我们切割的话用tmp指针往后走,str指针保存当前位置,所以tmp指针走到\0时我们还要将p_last处理成NULL,其他的情况(str串还能被delimiters分隔)我们就在函数内部把*tmp = ‘\0',再将p_last处理为下一次进来的位置即可。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 | int main() { char a[] = "wo ai ni" ; char * retArr[10]; retArr[0] = my_strtok(a, " " ); int i = 1; while (retArr[i++] = my_strtok(NULL, " " )); for ( int i = 0; i < 10; i++) { printf ( "%s " , retArr[i]); } return 0; } |
第一次分割
第二次分割
第三次分割
第四次切割
实现代码如下,有需要自取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | char * my_strtok( char * str, char * delimiters) { //str传NULL的时候如果上次有记录,则用上一次的下一个位置,不然就为NULL static char * p_last = NULL; if (str == NULL && p_last == NULL) return NULL; if (str == NULL) { //用来返回的当前位置 str = p_last; char * tmp = p_last; int len = strlen (delimiters); while (*tmp) { for ( int i = 0; i < len; ++i) { if (*tmp == delimiters[i]) { p_last = tmp+1; *tmp = '\0' ; return str; } } //走到这里表示当前的tmp没有在delimiters中能找到的 tmp++; } //走到这里就是自己走到斜杠\0的位置,就要将p_last 设置成为NULL char * ret = p_last; p_last = NULL; return ret; } else { char * tmp = str; int len = strlen (delimiters); while (*tmp) { for ( int i = 0; i < len; ++i) { if (*tmp == delimiters[i]) { p_last = tmp+1; *tmp = '\0' ; return str; } } //走到这里表示当前的tmp没有在delimiters中能找到的 tmp++; } //找到了,找不到 char * ret = p_last; p_last = NULL; return ret; } } |
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
C++实现LeetCode(77.Combinations 组合项)
这篇文章主要介绍了C++实现LeetCode(Combinations 组合项),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-07-07
最新评论