【 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 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少 ...
- 查找->静态查找表->次优查找(静态树表)
文字描算 之前分析顺序查找和折半查找的算法性能都是在“等概率”的前提下进行的,但是如果有序表中各记录的查找概率不等呢?换句话说,概率不等的情况下,描述查找过程的判定树为何类二叉树,其查找性能最佳? 如 ...
- 查找->静态查找表->折半查找(有序表)
文字描述 以有序表表示静态查找表时,可用折半查找算法查找指定元素. 折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等 ...
- 查找->静态查找表->顺序查找(顺序表)
文字描述 顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录:反之,若直至第一个记录,其关键字和给定值比较都 ...
随机推荐
- Linux telnet命令详解
telnet命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户 ...
- VS2017配置cuda9.1编译不过问题。
#if defined(_WIN32) #if _MSC_VER < 1600 || _MSC_VER > 1920 #error -- unsupported Microsoft Vis ...
- Shell脚本例子集合
# vi xx.sh 退出并保存 # chmod +x xx.sh # ./xx.sh -2. 调试脚本的方法 # bash -x xx.sh 就可以调试了 . -1. 配置 secureCRT 的设 ...
- 延期年金(deferred annuity)
含义:推迟m个时期后才开始付款的年金. 延期年金现值为 二.永续年金(Perpetuity) 永续年金:无限期支付下去的年金. 为期末付永续年金(perpetuity-immediate)的现值 表示 ...
- January 06 2017 Week 1st Friday
Victory won't come to me unless I go to it. 胜利是不会向我走来的,我必须自己走向胜利. I wish I can walk from one victory ...
- mac本机svn命令使用
公司项目用到svn,之前做版本管理用的是git. 现在对svn回顾学习了一下. 这里有一篇很好的入门教程 http://www.rubyrobot.org/tutorial/subversion-wi ...
- navicat连接PostgreSQL报:column “rolcatupdate” does not exist ...错误的解决办法
avicat premium 连接PostgreSQL出现: column “rolcatupdate” does not exist ... 错误如图: 解决方案: 看看你的navicat 是否为最 ...
- ZooKeeper学习之路 (五)ZooKeeper API的简单使用 增删改查
zookeeper文件系统的增删改查 public class ZKDemo1 { private static final String CONNECT_STRING = "hadoop1 ...
- [Java123] JDBC and Multi-Threading 多线程编程学习笔记
项目实际需求:DB交互使用多线程实现 多线程编程基础:1.5 :( (假设总分10) 计划一个半月从头学习梳理Java多线程编程基础以及Oracle数据库交互相关的多线程实现 学习如何通过代码去验证 ...
- FCC Truncate a string 解决方法
三行搞定 function truncate(str, num) { ab = str.length >num?num>3?str.slice(0,num-3)+ "...&qu ...