我的csdn博客

一个字符串常常包含几个单独的部分,它们彼此被分隔开来。每次为了处理这些部分,你首先必须把它们从字符串中抽取出来。

这个任务有#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介绍的更多相关文章

  1. python字符串截取、查找、分割

    Python 截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾. # 例1:字符串截取 str = '1234567 ...

  2. Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)

    833. 字符串中的查找与替换 对于某些字符串 S,我们将执行一些替换操作,用新的字母组替换原有的字母组(不一定大小相同). 每个替换操作具有 3 个参数:起始索引 i,源字 x 和目标字 y.规则是 ...

  3. 去除字符串中的html标记及标记中的内容

    去除字符串中的html标记及标记中的内容 --1.创建函数 create function [dbo].[clearhtml] (@maco varchar(8000)) returns varcha ...

  4. C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()

    //自定义一个字符串字串查找标准库函数strstr() #include<stdio.h> #include<string.h> char* myStrstr(char *st ...

  5. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  6. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  7. 查找->静态查找表->次优查找(静态树表)

    文字描算 之前分析顺序查找和折半查找的算法性能都是在“等概率”的前提下进行的,但是如果有序表中各记录的查找概率不等呢?换句话说,概率不等的情况下,描述查找过程的判定树为何类二叉树,其查找性能最佳? 如 ...

  8. 查找->静态查找表->折半查找(有序表)

    文字描述 以有序表表示静态查找表时,可用折半查找算法查找指定元素. 折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等 ...

  9. 查找->静态查找表->顺序查找(顺序表)

    文字描述 顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录:反之,若直至第一个记录,其关键字和给定值比较都 ...

随机推荐

  1. 第一个c程序和vs2017 在打开MFC rc文件时找不到rcdll.dl

    第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...

  2. Python学习---Django的基础操作180116

    Django创建数据库操作 django流程之model实例 settigs.py:更改Django2.0.1的配置,更新为之前的路径配置 'DIRS': [os.path.join(BASE_DIR ...

  3. Python实例---三级菜单的实现[low]

    # version: python3.2.5 # author: 'FTL1012' # time: 2017/12/7 09:16 menu = { '陕西': { '西安': { '未名区': [ ...

  4. Linxu下 expect的安装与使用

    expect学习 1.什么是except        Expect是基于Tcl的一个相对简单的免费脚本文件语言工具,用于实现自动和交互式程序进行通信            is a software ...

  5. c# 内存泄漏检查心得

    系统环境 windows 7 x64 检查工具:ANTS Memory Profiler 7 或者 .NET Memory Profiler 4.0 开发的软件为winform / windows s ...

  6. Jmeter和LoadRunner的区别

    1.Jmeter的架构跟LoadRunner原理一样,都是通过中间代理,监控&收集并发客户端发现的指令,把他们生成脚本,再发送到应用服务器,再监控服务器反馈的结果的一个过程. 2.分布式中间代 ...

  7. OC文件操作1

    主要内容: 1)文件操作:对文件本身的操作(NSManager) 2)对文件内容的操作(NSHandle) 1.NSManager 创建一个单例的file manager的对象 //创建一个单例的fi ...

  8. APPLICATION FAILED TO START

    Description: Cannot determine embedded database driver class for database type NONE Action: If you w ...

  9. Android Studio Git .gitignore文件配置忽略不需要的文件

    转载请标明出处: http://www.cnblogs.com/why168888/p/6440805.html 本文出自:[Edwin博客园] # Built application files * ...

  10. Windows环境下JDK的配置及多版本JDK切换的方法记录

    (这里记录了笔者了解的关于JDK环境配置的信息,以及针对系统上存在不同版本JDK时所尝试的解决方案.具体来说,是已安装 JDK 8 后,又安装了 JDK 9 时所遇到的问题和尝试的解决方法.这次记录以 ...