编程技能:字符串函数12,strtok

专栏导航

本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。

(一)WIn32 专栏导航

上一篇:编程技能:字符串函数11,strrchr

回到目录

下一篇:编程技能:字符串函数13,memcpy

(二)MFC 专栏导航

上一篇:编程技能:字符串函数11,strrchr

回到目录

下一篇:编程技能:字符串函数13,memcpy

本节前言

本节,我们要来学习的是字符串分割函数,strtok 。

这个函数,个人认为,讲解难度较高。

希望大家能够学好这个函数。

一.    strtok 基本介绍

想要使用 strtok 函数,如果是想要在 C 语言里面使用,那么,你需要有【#include <string.h>】一行。如果是想要在 C++ 里面使用,你需要有【#include <cstring>】一行。

下面,是 strtok 函数的原型声明。

char * strtok(char * s,const char * ct);

我在这里所列的原型声明,它只是我从 Linux 0.12 内核中提取出来的一种声明而已。在 Visual Studio 里面,它的声明形式不是这样子的。但是呢,我在这里列举出来的声明,它是可用的。

在这里,strtok 中的 str,是 string 的简写,是【字符串】的意思。而 tok,则是 token 的简写,是【标记】的意思。token,我觉得,它算是编译器所使用的一种术语。

token由编程语言定义,包含关键字(如ifreturn)、标识符(变量名、函数名)、运算符(+=)、常量(数值、字符串)及分隔符(如分号、逗号)等。例如,表达式x = y + 2;可分解为x(标识符)、=(赋值运算符)、y(标识符)、+(加法运算符)、2(常量)和分号(分隔符)。

token 的概念我讲完了。接下来,我们来看函数功能。

这个函数的功能,我认为是比较复杂一些的。讲起来,可能会有些吃力。我们分成不同的部分来讲解它。

此函数的总体功能,是将 s 所指向的待分割字符串分割成一个个字符串片段。ct 所指向的,是分隔符字符串。

假定,s 所指向的字符串为 "study+program+design", 而 ct 所指向的字符串为  "+",则分割字符串的结果为 “study”,"program" 和 "design" 。

ct 所指向的分隔符字符串,里面可以包含多于1个有效字符。

比如,令 ct 指向的字符串为 "+@^" 。此时,分割符的意思,并不是说,要连续出现【+@^】三个字符组合才算作是一个分隔符。它的意思是说,'+','@' 和 '^' 中的任何一个,都可以作为分隔符,都可以用于分割字符串 s 。

假定,ct 所指向的字符串为 "+@^",则以下几种情况之中,所得到的分割结果是相同的,结果均为 "Windows","Program" 和 "Design" 。

(1)s == "Windows+Program+Design" 。

(2)s == "Windows@Program@Design" 。

(3)s == "Windows^Program^Design" 。

(4)s == "Windows+Program@Design" 。

(5)s == "Windows@Program^Design" 。

(6)s == "Windows^Program+Design" 。

以上的几个举例,我想,意思应该算是表达清楚了。就是说,ct 所指向的分隔符字符串中的任何一个单独的字符,都可以作为分隔符,对 s 所指向的待分割字符串进行分割。并且,待分割字符串中的某一个分割字符,可以任意替换为其他的分割字符,分割结果是不变的。

我们可以再来丰富一下讲解。依然假定 ct 指向的分隔符字符串为 "+@^",在以下几种情况中,所得到的分割结果,依然是 "Windows","Program" 和 "Design" 。

(1)s == "Windows+++++Program@@@@Design" 。

(2)s == "@@@@Windows+++^^^Program^+^+^+Design^^^^^^^^" 。

(3)s == "^^^^Windows+@@@+Program@@@@^^^^Design@@@@@" 。

以上几个例子,我想要说的是,在待分割字符串里面,连续多个分割符会被视为一个分隔符。不论这连续出现的多个分隔字符是相同字符还是不同字符。并且,开头或者结尾部分的分隔符会被舍掉。

这样一来,strtok 函数的总体的功能,我就算是讲得差不多了。但是呢,还没有讲完。大家接着学啊。

接下来,我来说一说它的用法要点。每次调用 strtok 函数的时候,ct 参数,当然是要传入相同的分隔符字符串了啊。但是呢,s 所指向的待分割字符串参数,会有所不同。第一次调用 strtok 的时候,s 指向初始的待分割字符串,从第二次开始,每次给 s 传入的参数必须都是 NULL 。

每调用一次 strtok,都会有一个返回值。我们还是假定 ct == "+@^",则以下几种情况的返回值情况都是相同的:第一次返回 "Windows" 字符串指针,第二次返回 "Program" 字符串指针,第三次返回 "Design" 字符串指针。第四次返回 NULL 。

(1)s == "Windows+Program+Design" 。

(2)s == "Windows@Program@Design" 。

(3)s == "Windows^Program^Design" 。

(4)s == "Windows+Program@Design" 。

(5)s == "Windows@Program^Design" 。

(6)s == "Windows^Program+Design" 。

(7)s == "Windows+++++Program@@@@Design" 。

(8)s == "@@@@Windows+++^^^Program^+^+^+Design^^^^^^^^" 。

(9)s == "^^^^Windows+@@@+Program@@@@^^^^Design@@@@@" 。

档检测到返回值为 NULL 以后,这就应当作为调用 strtok 的最后一次。因为,当返回 NULL 的时候,表明本次的分割字符串的任务已经完成了。再往后,无论再调用多少次 strtok,返回的,都会是 NULL 。当第一次返回了 NULL 值以后,此后再去调用 strtok,就完全没有意义了。

我的概括能力还是不足的。对于 strtok 函数,我的讲解就是这样了。我不知道要如何来概括它的用法。只好这样子来举例子说明了。

不过,讲到这里,我想,你依然是不明白 strtok 的使用方法的。所以呢,我们给出 C 语言示例代码和 C++ 示例代码。请你从代码示例中,来自行体会 strtok 的使用方法。

二.    strtok 的 C 语言示例代码

代码如下。

#include <stdio.h>
#include <string.h>

int main(void)
{
	char* p;
	char str[] = "+++++Windows@@@@@@Program^^^^^^Design++++++";
	char splitter[] = "+@^";

	p = strtok(str, splitter);
	while (NULL != p)
	{
		printf("本次字符串:%s\n", p);
		p = strtok(NULL, splitter);
	}
	printf("字符串分割结束");

	return 0;
}

上述代码,是可以直接在 Visual Studio 里面运行的。

大家若是还不会使用 Visual Studio,可以参考下述链接所示的两篇文章,来学习使用 Visual Studio 来建立解决方案和编译运行解决方案的方法。

Windows编程:使用 VS2010 编写 C语言程序-优快云博客

Windows编程:用 VS2019 编写C语言程序-优快云博客

运算结果如下:

图1

三.    strtok 的 C++ 示例代码

代码如下。

#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
	char* p;
	char str[] = "+++++Windows@@@@@@Program^^^^^^Design++++++";
	char splitter[] = "+@^";

	p = strtok(str, splitter);
	while (NULL != p)
	{
		cout << "本次字符串:" << p << endl;
		p = strtok(NULL, splitter);
	}
	cout << "字符串分割结束\n";

	return 0;
}

结束语

strtok,我并不知道它有何用途。也许,有一天,你自己去写 C 语言编译器的时候,你会用到这个函数吧。就目前来讲,我在平时的编程中,还没有遇到过使用它的代码。Win32 里面我没有见过,MFC 里面我也没有见过。

但是呢,你得了解这个函数的用法,你得会。

必要的知识,还是要去储备一下的。备而不用,胜过用而无备。

本节结束。

专栏导航

本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。

(一)WIn32 专栏导航

上一篇:编程技能:字符串函数11,strrchr

回到目录

下一篇:编程技能:字符串函数13,memcpy

(二)MFC 专栏导航

上一篇:编程技能:字符串函数11,strrchr

回到目录

下一篇:编程技能:字符串函数13,memcpy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值