详解比较古怪的字符串拆分函数:strtok函数

简介: 详解比较古怪的字符串拆分函数:strtok函数

对于字符串中的标点符号,字符呀!!如何能够当作分隔符来对原字符串进行分割呢??分割出来的为一段一段的字符……因此,在这里面就用到了:本文:比较古怪的字符串拆分函数: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数组的初始状态:


0a2653c851af460fa595bd959398a8f1.png


通过strcpy(buf, arr);  //将arr拷贝到buf  结果为:


2d65d23f6d4748949b924e4057485923.png


想必这个过程,在之前看过笔者文章或者有过strcpy字符串拷贝函数知识的各位老铁,会是显而易见的答案!!这样就在buf函数内部进行切割就可以了!!


6de278e6d6694ce5bb08e7e842b7e74b.png


此时在str记录的是'w'的位置处的地址!在接着进入下一次切割


12c3b7f3f8814309a195c64f051d4445.png


虽然传入的是NULL(空指针)但是,由于strtok函数会记录位置,所以,仍然会正确的进行切分!!再接着进行……


34e8d716411043c08c7ffba9fbba23de.png


此时的str指向‘c’处的位置!!


在每次都能通过 printf("%s\n", str);  将其打印出来,所以就能实现字符串切割的目的了!


代码的运行结果为:


92ba0822ed0b46e1ae72df8a17d3a45b.png


但是,多写了一次: str = strtok(NULL, p);   printf("%s\n", str);  将会有着以下的打印情况:


d79b274929334152a6d38be91e2d1be3.png


对于上述的代码其实也可以用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循环内部,不用关注分割多少次!!所以显得比刚才的那个代码更加人性化!!


代码的运行结果也是一样的:


dfc80ca9d8004e6c9ddc00e8448ffc6a.png


本文就到次结束了先!!各位老铁若有不懂得问题,请及时私聊呀!!


相关文章
|
1月前
|
C++
字符类函数
字符类函数
15 4
|
1月前
|
存储 C语言 数据格式
解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)
解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)
19 0
|
6月前
|
Java 测试技术
strtok的基本用法
strtok的基本用法
51 0
|
6月前
|
安全 Unix Linux
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
130 0
利用函数求字符串长度
利用函数求字符串长度
66 0
字符串函数_strtok()
strtok是用来切割字符串的,引用头文件为#include<string.h> strtok函数的声明:
|
存储 测试技术 C++
在 C++ 中标记字符串与getline() 函数和字符数组
对字符串进行标记表示根据某些分隔符拆分字符串。有很多方法可以对字符串进行标记。在这篇文章中解释了其中的四个
112 0
|
存储 程序员
字符串拷贝和内存拷贝函数
字符串拷贝和内存拷贝函数
176 0
|
存储 安全 Linux
C++ strtok函数详解
C++ strtok函数详解
414 0
|
安全
04-2.C(字符串和函数)
01.scanf 1)scanf将回车空格都当作字符串结束的标志 2)以回车键作为输入完成的标识,但是回车键本身不会作为字符串的一部分 3)存在安全问题,加入用户在键盘输入的内容超过scanf参数中的数组长度,就会内存溢出,发生奔溃,这也就是微软在使用...
982 0