欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【 C 】字符串查找基础笔记

程序员文章站 2022-03-22 12:43:34
...

目录

查找一个字符

查找任何几个字符

查找一个字串

strrstr的自定义编写实践

strrpbrk的自定义编写实践


标准库中有很多函数,它们用各种不同的方法查找字符串。下面分别介绍:

先介绍标准库中有的,之后再扩展标准库中没有的。

查找一个字符

在一个字符串中查找一个特定字符分为两种情况:第一是查找特定字符第一次出现的字符,第二种是查找特定字符最后一次出现的字符。

分别对应的函数是:strchr 和 strrchr函数,它们的原型如下:

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

char *strrchr( char const *str, int ch);

注意第2个参数是一个整型值。(每个字符都会对应一个ASCII码,ASCII码是一个整形数值。)

strchr在字符串str中查找字符ch第1次出现的位置,找到后函数返回一个指向该位置的指针。如果该字符并不存在于字符串中,函数就返回一个NULL指针。strrchr函数名和strchr相比,多了一个字母r,代表“right”,也就是它返回的是一个指向字符串中该字符最后一次出现的位置(最右边那个),后面的函数出现r时,意义都是这样。

举个例子:

char string[20] = "Hello there, honey.";

char *ans;

ans = strchr( string, 'h' );

ans所指向的位置将是 string + 7,因为第1个'h'出现在这个位置。注意这里大小写是有区别的。

查找任何几个字符

strpbrk是个更为常见的函数。它并不是查找某个特定的字符,而是查找任何一组字符第1次在字符串中出现的位置。它的原型如下:

char *strpbrk( char const *str, char const *group );

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

在下面的代码段中,

char string[20] = "Hello there, honey.";

char *ans;

ans = strpbrk( string, "aeiou" );

ans所指向的位置是string + 1,因为这个位置是第2个参数中的字符第一次出现的位置。

查找一个字串

为了在字符串中查找一个字串,我们可以使用strstr函数,它的原型如下:

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

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

strrstr的自定义编写实践

注意,标准库中并不存在strrstr或strrpbrk函数。不过,如果你需要它们,它们可以很容易实现。下面给出一个实现strrstr的方法:

查找字串最右一次出现的位置:

//在字符串s1中查找字符串s2最右出现的位置,并返回一个指向该位置的指针

#include<string.h>

char * my_strrstr(char const *s1, char const *s2)
{
	register char *last;
	register char *current;
	
	last = NULL;
	
	//只有第2个字符串不为空时才进行查找,如果s2为空,则返回NULL
	
	if(*s2 != '\0')
	{
		//查找s2在s1中的位置
		current = strstr( s1, s2 );
		//我们每次找到字符串时,让指针指向它的起始位置,然后查找该字符串下一个匹配位置
		while(current != NULL)
		{
			last = current;
			current = strstr(last + 1, s2); //从上次查找到的匹配字符串的位置继续开始继续查找
		}
	}
	//返回指向我们找到的最后一次匹配的起始位置的指针
	
	return last;
	
	
}

strrpbrk的自定义编写实践

下面我们继续编写一个strrpbrk的程序,查找任何几个字符在字符串中最后出现的位置:

//在字符串s1中查找字符组中最右出现的位置,并返回一个指向该位置的指针

#include <string.h>

char * my_strrpbrk(char const *str, char const *group)
{
	register char *last;
	register char *current;
	
	last = NULL;
	
	//只有第2个group不为空时才进行查找,如果s2为空,则返回NULL
	
	if(*group != '\0')
	{
		//查找group中字符在str中的位置
		current = strpbrk( str, group );
		//我们每次找到匹配字符时,让指针指向它的起始位置,然后查找该字符下一个匹配位置
		while(current != NULL)
		{
			last = current;
			current = strpbrk(last + 1, group); //从上次查找到的匹配字符的位置继续开始继续查找
		}
	}
	//返回指向我们找到的最后一次匹配的起始位置的指针
	
	return last;
	
	
}

是不是和上面的那个很相似呢?确实如此!

只是改好了还不够有说服力,那就实际应用下看看,结果是否如意:

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

int main()
{

    char *my_string = "Soul Da, how is everything going?"; //在这个字符串中查找目标字符
    char *aim_string = "aeiou";       //需要查找的字符
    char *p;  //用来接收函数返回的指针


    //函数原型
     char *my_strrpbrk(char const *str, char const *group);

    //调用函数
     p = my_strrpbrk(my_string, aim_string);

    printf("%s\n", p);






    return 0;
}

//定义函数my_strrbprk
char *my_strrpbrk(char const *str, char const *group)
{
    register char *last;
    register char *current;

    last = NULL;

    //只有第2个group不为空时才进行查找,如果s2为空,则返回NULL

    if(*group != '\0')
    {
        //查找group中字符在str中的位置
        current = strpbrk( str, group );
        //我们每次找到匹配字符时,让指针指向它的起始位置,然后查找该字符下一个匹配位置
        while(current != NULL)
        {
            last = current;
            current = strpbrk(last + 1, group); //从上次查找到的匹配字符的位置继续开始继续查找
        }
    }
    //返回指向我们找到的最后一次匹配的起始位置的指针

    return last;


}

在codeblock中运行的结果为:

【 C 】字符串查找基础笔记

和预想的一样。

最后我提醒一下,这个程序在C++中竟然运行不出来,老是报错,并不是头文件的问题,头文件我也添加了C++中需要的。不管了,等到开始C++学习后再试试哪里出问题了。

还要提醒一点呢?就是函数的名字比较难记,别写错了,例如strpbrk写成了strbprk,因为这个问题我也是很郁闷,最后才发现我拼写出问题了。哈哈,可能是菜吧!