对于字符串中的标点符号,字符呀!!如何能够当作分隔符来对原字符串进行分割呢??分割出来的为一段一段的字符……因此,在这里面就用到了:本文:比较古怪的字符串拆分函数:strtok函数!!
假设:对于这个字符串:woaini@wangyijun.com 我们将“@ . "当作分隔符,来进行打印三个字符串!"woaini" "wangyijun" "com" 在这里面strtok函数,就起到了至关重要的地步!!
对于strtok函数我们在使用之前需要知道一下几点:
strtok函数的用法为:
char * strtok ( char * str, const char * sep )
1.在这个函数内部:sep参数是个字符串,定义了用作分隔符的字符集合!!”@ ."
2.第一个参数str指定一个字符串,它包含了由0个或者多个由sep 字符串中的一个或者多个分隔符分割的标记!!如:woaini@wangyijun.com
3.strtok函数找到str中的一个标记,并将其用'\0'结尾,返回一个指向这个标记的指针(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容,并且可修改)
4.strtok函数的第一个参数不为:NULL,函数将找到str中的第一个标记,strtok函数将保存他在字符串中的位置!
5.strtok函数的第一个参数为NULL,函数将在同一字符串中被保存的位置开始,查找下一个标记处!!
6.如果字符串不存在更多的标记,则返回NULL
下面请看笔者的使用代码::
//从woaini@wangyijun.com中打印出:“woaini" "wangyijun" "com" #include <stdio.h> #include <string.h> int main() { char arr[] = "woaini@wangyijun.com"; char buf[50] = { 0 }; strcpy(buf, arr); //将arr拷贝到buf //将arr拷贝到buf const char* p = "@."; //定义分隔符! char* str = strtok(buf, p); printf("%s\n", str); str = strtok(NULL, p); printf("%s\n", str); str = strtok(NULL, p); printf("%s\n", str); //后面要是再接着要写一个,会打印NULL(空指针) }
再上面的函数代码中:
1.首先,我们定义了一个其他的数组,用来存放拷贝的arr数组!!
2.对于: str = strtok(NULL, p); printf("%s\n", str); 在上面的代码中:传了个NULL(空指针),对于为什么这样进行,请参考上面的内容第4/5条!!该strtok函数有记忆功能,会记住位置!!
3.其实对于该函数的实现功能在调试的过程中,最容易显现出来过程,下面请看笔者的代码调试过程:
初始状态下的arr与buf数组的初始状态:
通过strcpy(buf, arr); //将arr拷贝到buf 结果为:
想必这个过程,在之前看过笔者文章或者有过strcpy字符串拷贝函数知识的各位老铁,会是显而易见的答案!!这样就在buf函数内部进行切割就可以了!!
此时在str记录的是'w'的位置处的地址!在接着进入下一次切割
虽然传入的是NULL(空指针)但是,由于strtok函数会记录位置,所以,仍然会正确的进行切分!!再接着进行……
此时的str指向‘c’处的位置!!
在每次都能通过 printf("%s\n", str); 将其打印出来,所以就能实现字符串切割的目的了!
代码的运行结果为:
但是,多写了一次: str = strtok(NULL, p); printf("%s\n", str); 将会有着以下的打印情况:
对于上述的代码其实也可以用for循环来实现:笔者的实现过程为:(仅供参考)
#include <stdio.h> #include <string.h> int main() { char arr[] = "woaini@wangyijun.com"; char buf[25] = { 0 }; strcpy(buf, arr); const char* p = "@."; for (char* str = strtok(buf, p); str != NULL; str = strtok(NULL, p)) { printf("%s\n", str); } return 0; }
在这个for循环内部,不用关注分割多少次!!所以显得比刚才的那个代码更加人性化!!
代码的运行结果也是一样的:
本文就到次结束了先!!各位老铁若有不懂得问题,请及时私聊呀!!