首页 > 其他分享 >浅谈strtok函数的原理与使用

浅谈strtok函数的原理与使用

时间:2023-02-19 21:45:16浏览次数:42  
标签:函数 strtok buffer qwe char 字符串 NULL 浅谈

对于strok函数的理解,自己也是很迷茫,尤其看到有的范例将第一参数设为NULL也很是不解,也是找了许多博文,并看了官方的英文文档才浅显地理解了。这位前辈的博文对我启发很大。链接:https://blog.csdn.net/liuintermilan/article/details/6280816

函数原型:

//函数原型
#include <string.h>

char *strtok(char *str, const char *delim);

函数功能为“Parse S into tokens separated by characters in DELIM.If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. ” 翻译成汉语就是:作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。

函数的返回值为子串的指针,即子串在源字符串中的起始位置。如果没有分隔的字符串则返回NULL

大家都知道strtok函数作用是用来分隔字符串,那他怎么分隔的做了些什么事呢。我的理解如下:

我们定义字符串与函数:

char buffer[32] = "qwe rty uio asd";
char *p;
p = strtok(buffer," ");

此时,如果我们输出buffer,为qwe.输出p为qwe.  这是因为经过strok函数buffer把第一个“ ”也就是空格替换成了‘\0’,也就是buffer[4] = '\0',其余位置不变,这就是为什么输出为qwe了。因此,使用strtok时一定要慎重,以防止源字符串被修改。

为什么strtok第一个参数能为NULL值?

这是因为每次调用结束前,strtok函数用一个this指针指向了我们设置的分解符的下一位,也就是'r',当参数为NULL时表示,表示继续从上一次this保存的位置,继续分隔字符串,至于为什么事NULL,可以参考strtok的源代码,使用的话只需记住结论就好。所以,将代码加上如下三行可以依次提取出rty,uio,asd.

char buffer[32] = "qwe rty uio asd";
char *p;
p = strtok(buffer," ");
p = strtok(NULL," ");
printf("%s\n",p);
p = strtok(NULL," ");
printf("%s\n",p);
p = strtok(NULL," ");
printf("%s\n",p);

以上printf输出依次为:rty,uio,asd.

也许有人会如果,我们偏不传NULL,就传源字符串会怎样呢?结果其实想得到,当第一次调用strtok的时候源字符串第四个字符“ ”空格已经被改为'\0'也就是NULL,所以,可见部分只剩下qwe,因此,结果肯定是找不到分解符“ ”。

分享到此告一段落,以下是使用strtok函数的注意事项:

1.strtok在调用的时候会忽略其实位置的分隔符,也就是说如果源字符串为:(qwe前多了个空格)

char buffer[32] = " qwe rty uio asd"

那么输出的结果还是"qwe".

2.不能向第一个参数传递字符串常量!

我在一次编程中定义源字符串为:

char *po = "qwe erty ui";

结果就报了段错误!

3.当设置第二个参数分隔符为字符串时,比如“asfd”,实际上是一个分隔符集合,相当于先以a为分隔符分隔。

标签:函数,strtok,buffer,qwe,char,字符串,NULL,浅谈
From: https://www.cnblogs.com/hetaoBlog/p/17135667.html

相关文章

  • 【JavaScript】17_debug,立即执行函数 与 严格模式
    14、debug<script>//debugger//在代码中打了一个断点console.log(a)//2vara=1console.log(a)//1fu......
  • 第六章 函数
    第六章函数函数基础函数定义:包括返回类型、函数名字和0个或者多个形参(parameter)组成的列表和函数体。调用运算符:调用运算符的形式是一对圆括号(),作用于一个表达式,该......
  • wait函数
    wait()函数:以阻塞的方式等待子进程退出,防止僵尸进程的产生头文件:      #include<sys/types.h>      #include<sys/wait.h>      pid_twaitpid(p......
  • 浅谈单调队列解决滑动窗口问题
    这次我们了解一下滑动窗口的问题首先,让我们了解一下滑动窗口是什么?这里有一张图(来自POJ),解释了滑动窗口的意思:我们可以看见,一个长度固定为3的框(窗口)从左端点移动到右......
  • 创建自己的函数库
    前言  回顾一下,前面点亮led灯我们都进行了哪些操作。  首先需要看电路图,然后找到led灯的控制引脚,然后了解了控制引脚的方法是通过操作相应的物理地址,接着知道了可以映......
  • 14.分组函数
    1.分组函数分组函数是操作一个分组的结果集,将行分组,按照组产生一个结果集,常用的分组函数有:avg,count,max,min,stddev,sum,variancehr@ORCLPDB012023-02-1915:58:03>selecta......
  • 对fork函数的进一步分析
       在fork之前的printf和write函数只会父进程调用一次,子进程不会调用,因为那时子进程还没有创建出来。当fork时,子进程被创建,程序只会往下顺序执行,但是前面父进程分配......
  • golang 单测运行单个函数、文件、跳过文件命令
    1、单测运行1.2运行某个单测函数gotest-v-run=xxx,xxx是函数名,支持正则表达式;参数-v说明需要打印详情提示Golang单测是根据前缀匹配来执行的,gotest-v-run=......
  • 13.转换函数
    1.隐式与显示数据转换--在表达式中Oracle服务器能自动转换--fromvarchar2orchartonumber--fromvarchar2orchartodate--fromnumbertovarchar2......
  • jstl 函数
         下面是JSTL中自带的方法列表以及其描述函数名函数说明使用举例fn:contains判断字符串是否包含另外一个字符串<c:iftest="${fn:contains(name,searchString)}">......