C语言进阶之字符串查找库函数详解

 更新时间:2023年01月18日 12:05:17   作者:工业废气  
字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中,下面这篇文章主要给大家介绍了关于C语言进阶之字符串查找库函数的相关资料,需要的朋友可以参考下

strstr

查找strstr的文档,可知它的原型为:

char *strstr( const char *string, const char *strCharSet );

它的返回值,根据文档是这样的: 

Return Value

Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.

可知会返回一个指针,指向目标字符串在strCharSet中第一次出现的位置。如果没有,就返回一个空指针。

简单地说,就是查找子字符串。

由于返回值是指针,那么接收返回值就要用指针类型来接收。

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abbbcdbbcef";
	char arr2[] = "bbc";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

输出结果如下:

如果我把arr2改成bbcq,那么在arr1中找不到arr2,就会返回空指针:

现在来模拟实现strstr。

分为两种情况。

情况1:

这种情况较为简单,arr1首先指向a,arr2指向b,a和b不相等,那么arr1指向下一个字符,此时arr2仍指向b,此时arr1和arr2指向的字符相等,那么arr2指向下一个字符,arr1也指向下一个字符,发现arr1和arr2指向的字符相等,那么arr2指向下一个字符,这时指向了\0,就停止了查找。

情况2:

arr1最开始指向a,arr2最开始指向b。

arr1和arr2所指向的字符不相等,那么arr1就指向下一个字符,arr2仍指向第一个b,此时arr1和arr2指向的字符相等,那么arr2指向下一个字符,arr1也指向下一个字符,发现arr1和arr2指向的字符相等,那么arr1和arr2继续指向下一个字符,此时arr1和arr2分别所指向的字符不相等,而此时arr2也不能向前指了,那么就停止了查找。

显而易见,这是有问题的!问题就在于第一个字符串里明明有第二个字符串的存在,却没有查找到。

正确的做法是,arr1指向出现的第二个b,arr2指向第一个字符,然后重新查找。

那么此时就需要有一些临时变量,不要用arr1和arr2亲自查找。

可以这样来实现模拟strstr:

#include <string.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')//用于判断srr2是不是空字符串
	{
		return (char*)str1;
	}
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;
	while (*cp)//当*cp为0时终止循环
	{
		s1 = cp;
		s2 = str2;//内循环每次开始前s2都指向要查找的字符串首元素,s1指向被查找的字符串里下一个字符
		while (*s1 !='\0' && *s2!='\0' && *s1 == *s2)
		{
			s1++;
			s2++;//只要字符串不结束并且指向的字符相等就循环
		}
		if (*s2 == '\0')//如果条件成立,说明找到了子字符串
		{
			return (char*)cp;
		}
		cp++;
	}
	return NULL;
}

strtok

这个函数不管是使用还是原理,都相当独特。其原型如下:

char *strtok( char *strToken, const char *strDelimit );

sep参数是个字符串,定义了用作分隔符的字符集合。

第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
记。

strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被其操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。

如果字符串中不存在更多的标记,则返回 NULL 指针。

字符串superverybest@outlooks.net是由@和.切开的,@和.其实就是分隔符。那么要将superverybest、outlooks、net分隔开,可以这样:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "superverybest@outlooks.net";
	char* p = "@.";
	char buf[50] = { 0 };
	strcpy(buf, arr);
	char* ret = NULL;
	for (ret = strtok(buf, p); ret != NULL; ret=strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

输出结果为:

总结

到此这篇关于C语言进阶之字符串查找库函数的文章就介绍到这了,更多相关C语言字符串查找库函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现单例模式的方法

    C++实现单例模式的方法

    这篇文章主要为大家介绍了C++实现单例模式的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C++11异步与通信之std::async的使用

    C++11异步与通信之std::async的使用

    std::async 异步运行一个函数,将返回值保存在std::future中,本文主要介绍了C++11异步与通信之std::async的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • C++处理输入字符串并转为数组的操作

    C++处理输入字符串并转为数组的操作

    这篇文章主要介绍了C++处理输入字符串并转为数组的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • C++中对象的动态建立与释放详解及其作用介绍

    C++中对象的动态建立与释放详解及其作用介绍

    这篇文章主要介绍了C++中对象的动态建立与释放详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++使用初始化列表的方式来初始化字段的方法

    C++使用初始化列表的方式来初始化字段的方法

    今天小编就为大家分享一篇关于C++使用初始化列表的方式来初始化字段的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++实现猜牌小游戏

    C++实现猜牌小游戏

    这篇文章主要为大家详细介绍了C++实现猜牌小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 详解C语言内核字符串转换方法

    详解C语言内核字符串转换方法

    在内核开发模式下,初始化字符串也需要调用专用的初始化函数,如下分别初始化ANSI和UNCODE字符串,本文我们就来看看代码是如何实现的
    2022-09-09
  • C语言实题讲解快速掌握单链表下

    C语言实题讲解快速掌握单链表下

    单链表是后面要学的双链表以及循环链表的基础,要想继续深入了解数据结构以及C语言,我们就要奠定好这块基石!接下来就和我一起学习吧
    2022-04-04
  • Qt通过图片组绘制动态图片

    Qt通过图片组绘制动态图片

    这篇文章主要为大家详细介绍了Qt通过图片组绘制动态图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 用C++实现SLR语法分析程序

    用C++实现SLR语法分析程序

    大家好,本篇文章主要讲的是用C++实现SLR语法分析程序,感兴趣的同学赶紧来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02

最新评论