你好, 欢迎回来｡ 又是一个激动人心的演讲｡
在这节课中,
我们将讨论更多关于字符串和字符串函数的内容, 主要是搜索､ 标记化和分析字符串的能力｡
我们来讨论一些字符串函数｡ 搜索字符串｡
搜索字符串｡
所有这些函数都在字符串头中｡
有一些字符串搜索函数是专门用于查找特定字符或子字符串的｡
这些函数的名称为strchr和strstr｡
在字符串中查找单个字符或子字符串｡
我们将提供一些例子｡
还有一些标记字符串的功能｡
你可以说什么是字符串的标记化｡ 首先, 您必须定义什么是令牌｡
标记是由分隔符限定的字符串中的字符序列｡
分隔符是您注意到的字符串中具有特殊含义的内容｡
如果你有一个完整的字符串, 这个是Jason,
用空格隔开.
一个标记可能是这个, 另一个可能是是, 另一个可能是杰森｡
这是一种获取整个字符串并根据分隔符在特定边界中将其拆分的方法｡
并且您希望确保分隔符在实际字符串中不是有效的｡
所以当你读文件的时候, 你也会使用分隔符, 同样的概念｡
你把一个句子分解成单词, 这叫做标记化｡ 我们将使用这个函数strtok｡
我还想讲一些分析字符串的知识｡
有很多不同的方法来检查字符是小写字符还是大写字符,
字母数字还是数字.
这些主要是在字符上完成的, 但字符在侧字符串中,
你也可以将它们应用于整个字符串｡
现在, 我们将深入了解字符串的更多细节｡
为了理解其中的一些函数, 我们必须先讲一下指针｡
指针在c中是一个巨大的概念｡
我们会有一整节专门讨论指针｡
可能是下一个或下一个｡
这是一个很大的讨论｡ 这可能是语言中最令人困惑的话题｡
我现在不想详细讨论这个问题, 因为这无关紧要｡
我只想简单介绍一下, 给你们一点关于指针的信息,
这样你们就能理解我们将要用到的一些函数了.
这是唯一的目的｡ 因此,
如果您在这几张幻灯片之后还没有完全理解指针, 请不要担心｡
指针的概念, 我们稍后会详细讨论｡
但是为了理解其中的一些字符串函数, 我想给予你快速浏览一下｡
C语言提供了一种非常有用的变量类型, 它被称为指针｡
我一直在谈论它｡ 它与内存和内存分配有关｡
有些语言如果你以前编程过,
而且你对编程并不完全陌生, 有些语言会自动为你管理内存｡
他们会为你分配内存并删除它, 像java这样的语言会这样做｡
它被称为垃圾收集器｡ 像c这样的语言不会做到这一点｡
因此, 无论何时创建内存以使用指针,
都必须删除该内存｡
但是指针是什么,
它非常有用, 它是什么, 它是一个存储地址的变量｡
记住, 地址是存储器中的东西｡
通常是十六进制的｡
地址中的值位于内存中的另一个位置｡
指针只指向一个包含值的地址｡
实际上, 我们过去在scanf函数中使用过地址｡
记住, 我们用的"符号是运算符的地址.
作为Scanf函数的第二个参数, 它必须接受一个变量来存储数据, 这个变量必须是一个指针.
所以scanf函数需要一个指针｡
创建一个整数本身, 它不是一个指针,
但是如果你得到它的地址, 它现在就变成了一个指针｡
所以我们用&号来得到一个基元数据类型的地址｡
你对地址的概念有点熟悉了｡
记住, 从现在开始, 用指针,
你创建了一个整数, 它不是指针,
它等于25｡
但是如果你得到了它的&号, 也就是它的地址, 你就可以把它赋给一个指针｡
Pointer在c中有特殊语法, 星号代表指针｡
所以我们声明了一个值为25的变量number,
然后用星号pNumber声明了一个指针, 其中包含number的地址｡
同样, 星号是用来声明指针的,
所以你知道它是指针数据类型｡
要得到变量p的值数是因为p的值数是什么？
它是一个指针, 指向内存中的一个地址｡
如果你试着看p的值, 它会给予你地址｡
如果你想得到地址指向的值, 你必须取消引用它｡
所以c使用了一种特殊的语法叫做星号和变量名, 这就是你如何访问包含值的内存位置｡
所以如果你想把数据分配到那个内存位置, 你必须说星星p号｡
同样, 其效果是它访问存储在由指针指定的地址处的数据｡
所以当我们谈论指针的时候, 会变得非常混乱, 因为你不习惯这个概念｡
你认为一个变量有一个值, 就是这样｡ 但是变量可以有一个地址, 而地址又可以有一个值｡
这张幻灯片试图说明我刚才提到的内容｡
我在我读过的一本书里找到了这个｡
这张幻灯片向您展示了内存中指针的概念, 以及如何处理地址｡
所以我在重申我刚才提到的｡
但&号的值是number所在的地址｡
所以如果你有两个变量, number和p
number, p number是一个指针, number是一个int,
你还要, 顺便说一下, 指定指针的类型｡
即使指针是一个地址, 您仍然需要指定类型或地址指向的位置｡
所以int, 星星, p, number等于number的地址｡
Number在内存中, 它指向一个地址,
例如, 一千, 它的值是25｡
对于实际的p编号, P编号具有地址105,
但是该地址的值是1000地址｡
为了得到p的值, 你必须解引用1000, 这将给予你25｡
我之所以提到指针, 是因为很多字符串函数都会返回指针.
其实也没那么重要｡
只有当你想知道如何在数组中得到某个字符时, 它才是重要的.
但我确实想简单地提一下｡
如果这个概念现在没有被理解, 也没关系,
因为我们将在后面的章节中详细介绍它｡
但是要知道, 我们现在要用到的字符串函数, 会返回指针,
然后你可能会用这个返回值来做一些有用的事情｡
在过去, 当我们使用str复制和str比较时,
我们传递了指针, 但它从不返回指针, 我们从不需要使用指针｡
现在我们要使用指针了, 我想简单说明一下给予的含义｡
指针只指向一个地址｡
然后你可以用这个地址来做解析或者任何你需要做的事情｡
希望你没被这事搞得不知所措｡ 同样, 如果你没有完全理解它, 也不要担心｡
现在我们来看看分析､ 标记化和搜索字符串的一些例子｡
要搜索字符串, 我们提到过, 你要使用strchr或者strstr｡
strchr在给定字符串中搜索单个字符｡
函数的第一个参数是要搜索的字符串, 它将是字符数组的地址｡
第二个参数是您要查找的字符｡
我们稍后将提供一个示例｡
所以这个函数会从字符串的开头开始搜索,
然后返回一个指针, 指向字符串中找到的第一个字符的位置.
这就是为什么指针现在很重要, 因为我们不是返回一个完整的值, 而是返回一个指向字符串中某个字符的指针,
而这个地址实际上代表了数组的索引｡
这个位置在内存中的地址, 是一个字符类型的星星, 它被描述为一个字符的指针,
实际上就是内存中的一个字符.
要存储返回的值, 必须创建一个可以存储字符地址的变量, 因此必须创建一个指针｡
如果现在找到该字符, 则函数将返回一个特殊值, 该值为空｡
Null表示指针不指向任何内容｡
当我们谈到指针时, 我们使用null,
null只是说它没有找到任何东西｡ 所以它没有指向任何东西｡
当它指向某个东西时, 它会指向你找到那个字符的地址,
然后你就可以从那里开始解析了｡
记住前面的课, 当你在内存中创建一个字符数组时,
你只需要把每个字符表示为一个字节｡
如果你正在解析一个字符串, 你想知道某个特定字符在字符串中的起始位置, 你可以返回那个字节,
然后从那里开始查找.
所以str char, 你怎么使用它｡
你说你创建了一个字符串, 我们在这里用一个快速的棕色狐狸初始化它｡
然后我们创建一个单独的字符并用q初始化它｡
然后我们创建了一个指针, 因为我们必须创建一个指针, 因为这是从str, char返回的,
它允许我们看到在字符串中, 我们找到了一个字符｡
我们要把指针初始化为null｡ 因为现在它不会指向任何东西｡
然后我们调用str char, 传入字符串, 也就是快速棕色狐狸,
然后传入单个字符, q.
接下来它会看到这只敏捷的棕色狐狸的身体内部｡
第一次找到q的时候, 它会返回q的地址｡
所以p得到的char实际上是指向str的第四个索引｡
因为t小于0, h小于1, e小于2,
空间小于3, q小于4｡
所以p得到了char, 在这个快速的棕色狐狸中指向q｡
所以你可以准确地看到字符串中字符的起始位置｡
所以str char的第一个参数是要搜索的第一个位置的地址, 也就是搜索字符串｡
第二个参数是要查找的字符, 即您要查找的字符, 单个字符｡
它要求第二个参数的类型为int｡
所以严格来说, str char, 第二个参数是.
但c编译器会自动将图表转换为int｡
实际上, 它将获得ASCII值｡
所以你可以定义一个q字符,
而不是一个char, 你可以把它定义为一个int.
这只是我想让你知道的技术细节｡
但是p得到的char会指向quick brown
fox, 因为它会从q开始, 然后如果你试图打印出来的话, 它会到达null终结符｡
所以当你运行这个例子的时候, 它实际上是一个快速的棕色狐狸｡
这就是在整个字符串中搜索单个字符的方法｡
使用str char, 然后使用指针, 然后显示指针｡
你如何显示指针？ 与显示其他字符的方式相同, 使用printf, percent s｡
所以这是一个很好的机制来搜索整个字符串中的字符｡
如果要在字符串（可能是子字符串）中搜索字符串, 则使用strstr｡
这可能是所有搜索功能中最有用的｡
它在一个字符串中搜索子字符串的匹配项｡
它返回一个指针, 指向第一个字符串中找到子字符串的位置, 这与str
char非常相似, 但它搜索整个字符串｡ 如果没有找到任何匹配项, 则返回null｡
第一个参数是要搜索的字符串, 就像str char一样｡
第二个是你要找的子字符串, 另一个字符串｡ 这里有一个例子｡
它看起来和另一个非常相似, 只不过我们要找的不是一个字符, 而是一个单词,
一个字符串.
所以我们有词, 它等于狗｡
我们有一条短信说, 每个人都有自己的一天｡
我们再次创建指针, 因为它必须是——这就是函数返回的结果｡
当我们调用strstr时, 我们在文本中传递我们想要查看的字符串｡
第二个参数是我们要在字符串中查找的单词｡
所以它会搜索word中第一次出现的字符串｡
字符串dog出现在文本中的第七个字符处｡
如果你看文字｡
文本sub 6将等于dog, 这就是它的开始｡
指针会指向text加6 dog的地址, 从这里开始,
然后指向空终止符.
所以警察马上就要狗急跳墙了｡
同时也要小心, 因为搜索区分大小写｡
如果你真的提供了一个大写的D-O-G, 你不会找到任何东西,
它只会寻找正确的大小写｡
但这是用来查找子字符串和字符串的,
非常有用, 因为很多时候在程序中,
你会说这个字符串在这个字符串里面, 因为它和grep很相似, 如果你在Linux上用过grep的话｡
我希望这是有意义的｡ 标记字符串｡
令牌是一个字符序列, 其中一个字符串由一个分隔符绑定, 我们知道这一点｡
分隔符可以是任何内容, 但它应该是该字符串的唯一内容｡
不要使用分隔符“A, ”因为现在它要在字符串中找到有效的单词｡
使其具有独特性, 如空格或逗号｡ 同样, 这通常被用作单个字符串中单词的边界｡
所以它把一个句子分解成单词, 这叫做标记化｡
此strtok函数用于标记字符串｡
它需要两个参数｡
要标记化的字符串, 它是包含空格和分隔符的整个字符串｡
然后是包含所有正受限字符的字符串｡
您可以指定要设定为边界的项目｡
这里有一个例子｡
我们正在创建一个字符数组80｡
它说你好, 你好, 你是达什我的名字是达什杰森｡
然后我们创建一个常量字符串来表示分隔符, 即减号和破折号｡
看起来有点不一样, 但还是减号, 破折号, 它们都是破折号｡
然后我们创建一个指针, 它是token｡
因为strtok将返回我们的每个令牌｡
所以如果我们调用strtok, 传入string和分隔符s,
token将等于它找到的第一个东西.
所以第一次调用strtok的时候, 它会等于hello how are
you space然后它会找到与破折号匹配的字符｡
如果你再打第二次, 它就会打印出我的名字｡
如果你第三次调用它, 它会输出Jason因为它会穿过破折号.
这就是为什么这里有一个while循环｡ 我们说, 当令牌不等于null时,
打印出令牌｡
然后通过调用strtok来获取下一个令牌｡
我们把null作为第一个参数,
s作为第二个参数, 然后我们显示｡
所以让我们在代码块中看一下, 因为这会让它更容易理解｡
所以我们来建造这个｡ 我们刚刚看过这个例子｡
我想向您展示输出是什么, 这样就可以清楚地看到这里发生了什么｡
在这里你会看到它打印出第一个标记, hello how
are you.
首先它会找到第一个令牌,
打印出来, 你好, 你好, 我的名字是, 然后是Jason.
所以现在我们有hello how are you,
找到第一个破折号, 打印出来｡ 我的名字是找到下一个令牌, 然后第三个是杰森｡
但是你必须调用令牌三次才能得到每个令牌｡
第一个将对字符串进行标记化｡
看下一个你可以传入null因为你不想再看了, 你只想得到下一个令牌.
所以你传递一个null给第二个, 然后你只传递一个s.
它会给予你str already tok的下一个标记｡
这就是如何使用strtok｡ 它对解析有很大帮助｡
你可以解析一些东西, 并得到一些边界｡
最后我想讲的函数是这些分析字符串的函数｡
有一大堆人, 所以我在这里摆了一张小桌子｡
是下层, 是上层｡ 它做的和你想的完全一样｡
它会测试字符是小写还是大写｡
我们正在测试某些字符, 但它们在字符串中使用｡
所以每个函数的参数就是你要找的字符｡
然后所有这些函数都返回一个非零的整型值如果字符在被测试的集合中.
所以我们要把int字符传递给inside, 寻找里面的单词｡
如果我们在一个单词里面有一个大写字母, 它会告诉我们,
我们也可以用它来解析字符方式的单个元素｡
所以返回值将转换为true或false, 这样你也可以将它们作为布尔值使用,
这很好｡
因此,
如果单词或字符包含小写字母, is lower将返回true｡
这里有一个很好的例子,
我想演示一下, 它会计算整个字符串中的字母数.
让我们运行这个程序, 因为这很清楚, 但是你应该注意到我们创建了一个缓冲区, 我们的输入缓冲区,
然后我们创建了三个要计数的整数.
我们告诉用户输入一个字符串, 字符数要少于我们读入的字符数｡
然后我们将查看该字符串, 看它是否包含某些字符｡
我们将通过查看数组中的每个索引来遍历这个字符串｡
这是我们的例子｡
同样, buffer是我们的字符数组,
它将存储输入｡ 我们将使用scanf来填充它｡
我们输入的字符串不能有空格, 它是一个字符串｡
我们将遍历它, 遍历缓冲区中的每个元素, 然后调用is
alpha, is
digit,
is punct函数, 看看这些字符是否在里面,
然后它将根据返回的true或false递增, 然后它将显示出字符串中有多少个字母, 数字和标点符号字符｡
让我们运行这个｡
我只需要输入一些大写字母, 或者一些数字｡
当我按回车键时, 它会计算所有的值｡
所以它说我的方向盘包含24个字母, 4个数字和一个标点符号,
冒号｡
这是一个很棒的小程序,
它利用了这些字符函数, 但对于分析字符串很有用,
因为这就是你要做的, 你在分析字符串, 但你只是一个字符一个字符地分析.
-谢谢—谢谢