请编写一个查找子字符串的程序,并统计子字符串出现的次数。

请编写一个查找子字符串的程序,并统计子字符串出现的次数。
**输入格式要求:"%s" 提示信息:"请输入主串:" "请输入要查找的串:"
**输出格式要求:"%s,%s:" "子串出现的次数:%d\n" "子串不在主串中\n"
程序运行示例1如下:
请输入主串:Hello,world!
请输入要查找的串:l
Hello,world!,l:子串出现的次数:3
程序运行示例2如下: 
请输入主串:Hello,world!
请输入要查找的串:abc
Hello,world!,abc:子串不在主串中
//1.3查找子字符串(查找元素最终版)
//使用:返回值为出现了多少次,返回-1则没找到.
int find_str(char* str1, char* str2,int *arr_pos)
{
	str1[strlen(str1)] = '\0';
	str2[strlen(str2)] = '\0';//这两个步骤是为了把\n去掉,回车也算字符
	int flag=0;
	char first = str2[0];
	int A = find_e_plus(str1, first,arr_pos);
	if (A == -1)
	{
		//printf("子串不在主串中");
		return -1;
	}
	else
	{
		for (int k = 0, j = arr_pos[k];k<A; k++)//数组中下标一个个开始算
		{
			int m = 0;
			for (int i = j; i < strlen(str2)+j; i++)//这个相当于找到头了,判断后面相等不相等,循环结束代表判断
			{
				if (str1[i] == str2[m])//会判断strlen(str2)次
				{
					m++;
					flag++;//所以如果都能对上,那么应当是strlen(str2)次
				}
				else//如果没对上,那么直接跳出当前的判断.
					break;
			}
		}
		if (flag == 0)//没找到
		{

			return -1;
		}
		else
			return flag/strlen(str2);//看看有多少个这样字符串;
	}
}

上篇文章分享了几个查找单个字符的函数:

如下:

// 1.1在字符串中查找某一元素,并且记录下标.
/*使用:返回值为查找元素的下标(不是第几个哦)(返回最近的一个), 如果没有返回 -1*/
int find_e(char* str, char e)
{
	int i = 0;//参与循环
	int pos = -1;//记录下标
	for ( i = 0; str[i]!='\0'; i++)
	{
		if (str[i] == e)
		{
			pos = i;
			//printf("查抄的字符%c在字符串中的第%d个\n", e, pos + 1);
			return pos;
		}
	}
	if (str[i] == '\0')//也可以查到'\0'
	{
		pos = i-1;
	}
	if (pos == -1)
		return pos;
}

//1.2在字符串中查找元素,并且返回位置.
/*使用:用数组储存, 返回 - 1就是没有查到*///记得将数组格式化
int find_e_plus(char* str, char e, int* arr_pos)
{
	int j = 0;
	int flag = -1;
	for (int i = 0; str[i] != '\0'; i++)
	{
		if (str[i] == e)
		{
			arr_pos[j] = i;
			j++;
			flag = 1;
		}
	}
	if (flag == -1)
		return -1;
	else
		return j;//返回有多少个这样的字符
}

在第三个函数中,我也运用了第二个函数来简化代码.对于题目的解答如下:

int main()
{

	char str1[80]; 
	char str2[80];
	int arr_pos[80] = {0};
	//int A=find_e_plus(str1, 'b', arr_pos);
	//printf_arr(arr_pos, A);
	printf("请输入主串:");
	scanf("%s", str1);
	str1[strlen(str1)] = '\0';
	printf("请输入要查找的串:");
	scanf("%s", str2);
	str2[strlen(str2)] = '\0';
	int end = find_str(str1, str2, arr_pos);
	if (end == -1)
	{
		printf("%s,%s:", str1, str2);
		printf("子串不在主串中\n");
	}
	else
	{
		printf("%s,%s:", str1, str2);
		printf("子串出现的次数:%d\n", end);
	}
	return 0;
}

借助函数我们可以最大程度的简化代码.这道题如果不用函数解答,大家可以尝试一下,对比来看.

这个查找字符串字串的函数应当很常用,所以我将它单独拿出来分享,以后遇到相同的问题,可以用这个函数直接解答.对于函数的使用我在代码中都有注释标注.如有错误,希望大家评论区指正.

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值