前言

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

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

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

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

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

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

  • 《C Primer Plus》
  • 《Pointer on C》
  • Akaedu
  • runoob.com

本文文案:@Hoyue


字符串与指针

查找一个字符

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

复习下strchar函数:

char *strchr(const char *str, int ch)

  • str -- 要被检索的 C 字符串。
  • c -- 在 str 中要搜索的字符。

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

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

查找任何几个字符

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

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

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

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

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

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

查找一个子串

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

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

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

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

我们可以这样写:

char* strrstr( char const *s1, char const *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;
}

链表与指针

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

【C专题】结构体和链表