详解比较古怪的字符串拆分函数: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月前
|
安全 Unix Linux
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
16 0
|
9月前
|
安全 C++ 数据格式
C++ 字符串格式化转为 数据变量 - sscanf,sscanf_s及其相关用法
C++ 字符串格式化转为 数据变量 - sscanf,sscanf_s及其相关用法
147 0
|
10月前
利用函数求字符串长度
利用函数求字符串长度
48 0
|
11月前
字符串函数_strtok()
strtok是用来切割字符串的,引用头文件为#include<string.h> strtok函数的声明:
|
存储 测试技术 C++
在 C++ 中标记字符串与getline() 函数和字符数组
对字符串进行标记表示根据某些分隔符拆分字符串。有很多方法可以对字符串进行标记。在这篇文章中解释了其中的四个
83 0
|
存储 程序员
字符串拷贝和内存拷贝函数
字符串拷贝和内存拷贝函数
150 0
|
存储 安全 Linux
C++ strtok函数详解
C++ strtok函数详解
358 0
|
安全
04-2.C(字符串和函数)
01.scanf 1)scanf将回车空格都当作字符串结束的标志 2)以回车键作为输入完成的标识,但是回车键本身不会作为字符串的一部分 3)存在安全问题,加入用户在键盘输入的内容超过scanf参数中的数组长度,就会内存溢出,发生奔溃,这也就是微软在使用...
960 0
使用strtok_s函数从一个字符串中分离出单词
下面的代码从含有多个结束符的字符串中分离出单词来,需要对strtok_s有清楚的认识。这段代码是我在写一个处理文件中单词个数时用来分离读取到的字符串中的单词时写的,亲测可用~   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22...
902 0

热门文章

最新文章