天天看点

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

目录

查找一个字符

查找任何几个字符

查找一个字串

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指针。

在下面的代码段中,

ans = strpbrk( string, "aeiou" );

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

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

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

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

注意,标准库中并不存在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的程序,查找任何几个字符在字符串中最后出现的位置:

//在字符串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,因为这个问题我也是很郁闷,最后才发现我拼写出问题了。哈哈,可能是菜吧!

继续阅读