851 字
4 分钟
【专题】三篇文章搞定C指针——其三

前言#

本期专题:《三篇文章搞定 C 指针》

专题地址(打不开就是没写完或者在修改):

这一期是 C 语言的指针专题,其实大部分内容也同样使用与 C++ 中,后续有的指针补充将会另出专题。

在这一篇文章中介绍了指针在字符串、链表中应用。

WARNING

本专题文章内容相对基础,过于专业的部分会省略。

本专题参考文献或网站如下(References):

  • 《C Primer Plus》

  • 《Pointer on C》

  • Akaedu

  • runoob.com

本文文案: @Hoyue


字符串与指针#

查找一个字符#

在一个字符串中查找一个特定字符最容易的方法是使用 strchrstrrchr 函数。

复习下 strchr 函数:

char *strchr(const char *str, int ch)
  • str — 要被检索的 C 字符串。
  • c — 在 str 中要搜索的字符。

strchr 在字符串 str 中查找字符 ch 第一次出现的位置,找到后函数返回一个指向该位置的指针,如果未找到该字符则返回 NULL。

strrchr 函数的声明参数与 strchr 基本一致,不同的是它所返回的是一个指向字符串中该字符最后一次出现的位置。

查找任何几个字符#

有这么一个函数,它可以查找任何一组字符第一次在字符串中出现的位置。

它的原型:char *strpbrk(const char *str, const char *group);

这个函数返回一个指向 str 中第一个匹配 group 中任何一个字符的字符位置。如果未找到匹配,函数返回一个 NULL 指针。

这么说可能会让人看不懂,所以举个例子。

char string[] = "Hello, how are you";
char *ans = strpbrk(string, "aeiou");

在这个例子中,ans 指向的位置是 string + 1,意思为查找 string 中 aeiou 元音的任意一个的第一次出现的位置,故为第二个字符。

查找一个子串#

在字符串中查找一个子串,我们可以使用 strstr 函数,我们同样复习一下,它的原型是:

char *strstr(const char *s1, const char *s2);

这个函数在 s1 中查找整个 s2 第一次出现的起始位置,并返回一个指向该位置的指针。如果 s2 并没有完整地出现在 s1 的任何地方,函数将返回一个 NULL 指针。如果第 2 个参数是一个空字符串,函数就返回 s1。

如果我们想像之前的 strrchr 一样,做到查找到最后出现的位置,标准库里没有这样的函数,我们可以自己写。首先需要添加 <string.h> 的标准库。

我们可以这样写:

char* strrstr(const char *s1, const char *s2)
{
register char *last;
register char *current;
// 使用寄存器定义,可以加快速度
last = NULL; // 初始化为最初
if (*s2 != '\0') // 特判:只在第2个字符串不为空时才进行查找,如果 s2 为空,返回 NULL。
{
current = strstr(s1, s2); // 查找 s2 在 s1 中第 1 次出现的位置。
while (current != NULL) // 每次找到字符串时,让指针指向它的起始位置。然后查找该字符串下一个匹配位置。
{
last = current;
current = strstr(last + 1, s2);
}
}
return last;
}

链表与指针#

关于链表的内容很多都与指针有关,相关的就不赘述,请看:

https://hoyue.fun/linkedlist_c.html#i-20

【专题】三篇文章搞定C指针——其三
https://hoyue.fun/pointer_c3.html
作者
Hoyue
发布于
2022-01-29
最后更新于
2024-01-14
许可协议
CC BY-NC-SA 4.0
评论