【 C 】字符串查找基础笔记
目录
标准库中有很多函数,它们用各种不同的方法查找字符串。下面分别介绍:
先介绍标准库中有的,之后再扩展标准库中没有的。
查找一个字符
在一个字符串中查找一个特定字符分为两种情况:第一是查找特定字符第一次出现的字符,第二种是查找特定字符最后一次出现的字符。
分别对应的函数是: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++学习后再试试哪里出问题了。
还要提醒一点呢?就是函数的名字比较难记,别写错了,例如strpbrk写成了strbprk,因为这个问题我也是很郁闷,最后才发现我拼写出问题了。哈哈,可能是菜吧!
上一篇: python 2.7.14安装图文教程
下一篇: 字符串查找之KMP
推荐阅读
-
C++学习笔记(字符串string、vector_deque、queue,multiset、map、multimap、容器拷贝问题)(复制粘贴,方便后面翻阅)
-
复习C++基础知识-----“我的第一本C++”读书笔记4(终篇)
-
复习C++基础知识-----“我的第一本C++”读书笔记2
-
复习C++基础知识-----“我的第一本C++”读书笔记1
-
复习C++基础知识-----“我的第一本C++”读书笔记3
-
C#基础_学习笔记--结构体
-
c++ primer plus笔记(8)类基础
-
c#字符串查找某词出现的次数及索引
-
C#中怎样从指定字符串中查找并替换字符串?
-
带着问题读CLR via C#(笔记二)类型基础