C语言拾遗——strtok

今天刷PAT的时候用到了这个strtok函数,顺手就记录一下

strtok函数包含于头文件string.h

语法:char *strtok( char *str1, const char *str2 );

功能:函数返回字符串str1中紧接“标记”的部分的指针, 字符串str2是作为标记的分隔符。如果分隔标记没有找到,函数返回NULL。为了将字符串转换成标记,第一次调用str1 指向作为标记的分隔符。之后所以的调用str1 都应为NULL

下面是测试代码

#include <stdio.h>
#include <string.h> int main(void)
{
char p[] = "My name is zzy.";
char tmp[20];
char *sep = " ";
char *token = NULL; strcpy(tmp, p); for (token = strtok(tmp, sep); token != NULL; token = strtok(NULL, sep))
{
printf("%s\n", token);
} return 0;
}

运行结果:

讨论一下为什么第二个strtok的第一个参数一定为NULL

strtok的原型如下:

_CRTIMP char* __cdecl __MINGW_NOTHROW	strtok (char*, const char*);

这个函数涉及两个指针,除了形参之外

第一个指针 pointer_a 用来指向函数返回的字符串,这个字符串是被原字符串OriginalString被seps中的字符截断后的第一个字符串。

第二个指针 pointer_b 用来指向OriginalString中,匹配截断字串seps的位置

如果在第二次函数调用的时候,第一个参数不是设置为NULL而是设为原来的字符串”My name is zzy.”,那么讲永远返回”My”并且也将陷入死循环。
为何会出现这种结果呢?

其实认真想想就很清楚啦。

第一次传入字符串”My name is zzy.” 中匹配token(即参数seps代表的各种字符)中所指定的字符的位置在My和name之间, 函数的返回值pointer_a为一个指向”My”的指。

指针此时,pointer_b指向My和name之间的位置,代表pointer_b之前的位置已经进行过查找匹配了。

这样,在循环体之内进行第二次函数调用的时候,只要把strtok()的第一个参数设置为NULL,就可以直接从pointer_b位置开始进行查找匹配了。 pointer_b 会保持之前的位置一直指下去

所以,NULL的作用只是为了使得每次调用时,都不是从”My name is zzy.”的头开始,而是从上次调用时查找所停止的位置开始的啦。如此循环下去,直到无法再找到匹配token的位置的时候,这样就实现了把”My name is zzy”按照token进行分隔的效果啦O(∩_∩)O

C语言拾遗——strtok的更多相关文章

  1. C语言拾遗(一)

    越来越体会到C语言的重要性,不管是在计算机底层的理解上,还是在算法数据结构上,所以遂决定重新拾起C语言,不定期更新一些知识点. 推荐博客:http://blog.csdn.net/itcastcpp ...

  2. C语言拾遗

    1. 没C++那么恶心的const C语言中的const修饰符用于修饰一个变量是const属性的.被C语言的const修饰的变量具有只读属性,并且不能被修改. const修饰的变量 != 常量,con ...

  3. C语言拾遗--static

    C程序一直由下列部分组成: 正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里. ...

  4. C语言拾遗——inttypes.h

    今天偶然间看到这个头文件inttypes,好奇有什么用,去找度娘玩了一波,发现这头文件挺有意思的. 这个头文件适配于C99标准,它提供整数输入的各种进制转换的宏,这是在Ubuntu上扣下来的代码(wi ...

  5. C语言拾遗——sscanf

    今天写题用到了sscanf,怕忘赶紧记录一下 去百度了一下这玩意的函数原型好像是长这样的,微软上扣下来的  int sscanf( const char *buffer, const char *fo ...

  6. c语言,数据类型转换

    在执行算术运算时,计算机比C语言的限制更多.为了让计算机执行算术运算,通常要求操作数有相同的大小(即位的数量相同),并且要求存储的方式也相同.计算机可能可以直接将两个16位整数相加,但是不能直接将16 ...

  7. Go语言核心36讲(导读)--学习笔记

    目录 开篇词 | 跟着学,你也能成为Go语言高手 导读 | 写给0基础入门的Go语言学习者 导读 | 学习专栏的正确姿势 开篇词 | 跟着学,你也能成为Go语言高手 Go 语言是由 Google 出品 ...

  8. iOS-C基础

    iOS开发系列--C语言之基础知识 概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(i ...

  9. 自学导航页(待续ing)

    1 博客导航1.1 linuxlinux全线教程–提供了linux教程,服务器管理教程,BSD教程,还有编程语言(C/Java/Python/Perl),以及网络等全栈学习教程 1.2 存储技术NoS ...

随机推荐

  1. 【转】IntelliJ IDEA 仿照vs2017快捷键设置,以及字体颜色设置

    因后期工作需要使用java技术栈,所以近期抽空下载了intelliJ IDEA工具,但是作为一个Net开发者,在使用了vs以后,感觉在使用别的开发工具感觉就是没法和vs相比,毕竟vs被称为宇宙最强id ...

  2. 敏捷团队协作:Confluence简易教程

      0.Confluence简介 Confluence是一个企业级的Wiki软件,可用于在企业.部门.团队内部进行信息共享和协同编辑. 1.基础概念 Confluence的使用并不复杂,只需掌握如下几 ...

  3. 树莓派4B踩坑指南 - (1)系统简介及特性

    系统简介及特性 19年双十一入坑树莓派4B,发现不是一般的坑,对于新出来的4B,从外包装壳,到接口,到内核,很多老的资料已经不再适用,又没有什么特别大的论坛可以讨论,只能自己一点点的摸索. 所以将遇到 ...

  4. Linux centos7 VMware MariaDB安装、Apache安装

    一.MariaDB安装 cd /usr/local/src 进入包放置目录 官网下载 wget http://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb ...

  5. LeetCode 101.对称二叉树 - JavaScript

    题目描述:给定一个二叉树,检查它是否是镜像对称的. 题目分析 下面这种二叉树就是镜像对称的,符合题目要求: 1 / \ 2 2 / \ / \ 3 4 4 3 解法 1:递归检查 根据题目" ...

  6. Day11-G - Calendar Game HDU - 1079

    Adam and Eve enter this year’s ACM International Collegiate Programming Contest. Last night, they pl ...

  7. 「SPOJ10707」Count on a tree II

    「SPOJ10707」Count on a tree II 传送门 树上莫队板子题. 锻炼基础,没什么好说的. 参考代码: #include <algorithm> #include &l ...

  8. Python 基础之面向对象类的继承与多态

    一.继承 定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法继承: 1.单继承 2.多继承子类: 一个类继承了另外一个类,那么这个类是子类(衍生类)父类:一个类继承了另外一个类,被继 ...

  9. redis 之redis持久化rdb与aof

    redis是内存型的数据库 重启服务器丢失数据 重启redis服务丢失数据 断电丢失数据 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种 ...

  10. Python语法速查: 20. 线程与并发

    返回目录 本篇索引 (1)线程基本概念 (2)threading模块 (3)线程间同步原语资源 (4)queue (1)线程基本概念 当应用程序需要并发执行多个任务时,可以使用线程.多个线程(thre ...