【 C 】高级字符串查找之查找标记(token)函数 strtok介绍
一个字符串常常包含几个单独的部分,它们彼此被分隔开来。每次为了处理这些部分,你首先必须把它们从字符串中抽取出来。
这个任务有#include<string.h>中的strtok函数完成。(str代表字符串,tok代表标记(token))。它从字符串中隔离各个单独的称为标记(token)的部分,并丢弃分隔符。
函数原型如下:
char *strtok( char *str, char const *sep );
sep参数是个字符串,定义了用作分隔符的字符集合,(也就是sep字符串中的字符都作为分隔符)。第一个参数str指定一个字符串,它包含零个或多个有sep字符串中的分隔符分隔的标记,(这里的标记指的是分隔出来的一个又一个子字符串)。strtok找到str的第一个标记,并将其用NUL字节结尾,然后返回一个指向该标记的指针。
警告:
当strtok函数执行任务时,它将会修改它所处理的字符串。如果源字符串不能被修改,那就复制一份,将这份拷贝传递给strtok函数。
如果strtok函数的第一个参数不是NULL,函数将找到字符串的第一个标记。函数同时将保存它在字符串中的位置。
如果strtok函数的第一个参数是NULL,函数就在同一个字符串中从这个被保存的位置开始查找下一个标记。如果字符串内不存在更多的标记(也就是查找到了最后一个标记),strtok函数就返回一个NULL指针。
在典型情况下,向它传递一个指向字符串的指针。然后,这个函数被重复调用,直到它返回NULL为止。
先给出一个直观的例子感受下:
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL ) {
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
运行的结果为:
这个例子的地址:https://www.tutorialspoint.com/compile_c_online.php
不解释了,很简单。
突然发现《C与指针》的例子不错,这个例子是从字符数组中提取空白字符分隔的标记并把它们打印出来:
void print_tokens(char *line)
{
static char whitespace[] = "\t\f\r\v\n";
char *token;
for( token = strtok( line, whitespace );
token != NULL;
token = strtok( NULL, whitespace )
)
printf("Next token is %s\n", token );
}
关于这个函数的功能,我们可以测试一下:
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "This is www.tutorialspoint.com website";
//函数原型
void print_tokens(char *line);
//函数调用
print_tokens( str );
return(0);
}
void print_tokens(char *line)
{
static char whitespace[] = "\t\f\r\v\n";
char *token;
for( token = strtok( line, whitespace );
token != NULL;
token = strtok( NULL, whitespace )
)
printf("Next token is %s\n", token );
}
暂时放这,功能和我预想的有点出入!暂未找到原因!
执行上个程序,结果是:
这并不是我所想的结果,上面的结果相当于没有分隔出来,到底是什么原因呢?
原来那个分隔字符串whitespace在初始化的时候除了问题,初始化中没有把空白字符包括进去,改正如下:
static char whitespace[] = " \t\f\r\v\n";
如此以来,结果就符合预想了:
就这样吧,最后推荐一波:
《C 与 指针》
https://baike.baidu.com/item/strtok
https://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
https://blog.csdn.net/ituling/article/details/52381583
【 C 】高级字符串查找之查找标记(token)函数 strtok介绍的更多相关文章
- python字符串截取、查找、分割
Python 截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾. # 例1:字符串截取 str = '1234567 ...
- Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)
833. 字符串中的查找与替换 对于某些字符串 S,我们将执行一些替换操作,用新的字母组替换原有的字母组(不一定大小相同). 每个替换操作具有 3 个参数:起始索引 i,源字 x 和目标字 y.规则是 ...
- 去除字符串中的html标记及标记中的内容
去除字符串中的html标记及标记中的内容 --1.创建函数 create function [dbo].[clearhtml] (@maco varchar(8000)) returns varcha ...
- C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()
//自定义一个字符串字串查找标准库函数strstr() #include<stdio.h> #include<string.h> char* myStrstr(char *st ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少 ...
- 查找->静态查找表->次优查找(静态树表)
文字描算 之前分析顺序查找和折半查找的算法性能都是在“等概率”的前提下进行的,但是如果有序表中各记录的查找概率不等呢?换句话说,概率不等的情况下,描述查找过程的判定树为何类二叉树,其查找性能最佳? 如 ...
- 查找->静态查找表->折半查找(有序表)
文字描述 以有序表表示静态查找表时,可用折半查找算法查找指定元素. 折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等 ...
- 查找->静态查找表->顺序查找(顺序表)
文字描述 顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录:反之,若直至第一个记录,其关键字和给定值比较都 ...
随机推荐
- js的一道经典题目
今天碰到一道题,里面既包含了匿名函数的知识,也包含了预编译,函数的传参(形参),感觉迷迷糊糊的,所以想着做个总结. var foo={n:1}; (function(foo){ console.log ...
- Linux命令--网络管理
write命令 Linux write命令用于传讯息给其他使用者. 使用权限:所有使用者. 语法 write user [ttyname] 参数说明: user : 预备传讯息的使用者帐号 ttyna ...
- npm 使用国内镜像的方法
npm全称Node Package Manager,是node.js的模块依赖管理工具.由于npm的源在国外,所以国内用户使用起来各种不方便.我们通过设置使用淘宝的镜像来加快我们的速度. 临时使用 n ...
- Ubuntu 14.04 下安装Skype
操作1: Ubuntu 14.04 下安装Skype,使用 Ctr+Alt+T组合键打开终端Terminal,输入如下即可: wget -O skype.deb http://download.sky ...
- 文件属性及OS模块使用(IO入门2)
转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] 文件属性及OS模块使用(IO入门2) 1. pytho ...
- python面向对象之类成员
面向对象编程: OOP编程是利用类和对象来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得简单,并可以大大提高程序开发效率.另外,基于面向对象的程序可 ...
- 学习python第二天数据库day1
day01: 关键字:desc 作用:查看表结构(字段名,数据类型&长度) 举例: desc python1808_laoguo; 追加数据到表中:(新增操作) 关键字:insert into ...
- 面向对象的JavaScript --- 多态
面向对象的JavaScript --- 多态 多态 "多态"一词源于希腊文 polymorphism,拆开来看是poly(复数)+ morph(形态)+ism,从字面上我们可以理解 ...
- [CTSC2018]假面
题目 先来考虑一下第一问,血量有\(P\)的概率减\(1\) 由于我们最后需要求每一个人的期望血量,于是考虑维护出每个人处于不同血量时候的概率 一个简单\(dp\)即可 \[dp_{i,j}=dp_{ ...
- bzoj 3339 Rmq Problem / mex
题目 我的树状数组怎么那么慢啊 就是一道水题,我们考虑一下对于一个区间\([l,r]\)什么样的数能被计算 显然需要对于一个\(j\),需要满足\(j<l\)且\(nxt_{j}>r\), ...