编写程序,统计字符串str中含有子字符串substr的个数

编写程序,统计字符串str中含有子字符串substr的个数。
要求:(1)字符串从键盘输入;(2)分别用下标法和指针法实现。

思路:
首先你需要从键盘输入原字符串,再输入你想要查询的子字符串;
比如:我输入一个这样的字符串:nnnnQAQnnnn
然后我想查询一下nnn这个子字符串在原字符串中的个数;
先观察这两个字符串,不难发现其实有4个这样的子字符串。
想要知道这个子字符串在原字符串中到底有没有,首先应该拿要查询的子字符串中的
第一个字母和原字符串的第一个字母比较,如果这两个字母相同的话,就应该拿自字符串的
第二个字母和原字符串的下一个字母作比较,一直进行下去...那么比较的次数其实就是子字符串的长度;
如果子字符串的第一个字母与原字符串的第一个字母不一样,那么就和原字符串的第二个字母比较。

开始操作:

根据题目要求:分别使用下标法和指针发实现;
那我们先从简单的下标法来做一遍吧.
#include <stdio.h>
#include <string.h>
int main()
{
	char str[20];//可输入的原字符串的长度为19
	int len1, len2;//定义两个变量,分别用来保存原字符串和子字符串的长度
	printf("输入原字符串:");
	gets(str);
	len1 = strlen(str);//原字符串长度
	char substr[20];
	printf("输入子字符串:");
	gets(substr);
	len2 = strlen(substr);//子字符串长度
	int n = 0, sum = 0;//sum为累加器
	for (int i = 0; i <= len1-len2; i++)//外层循环用来遍历数组
	{
		int k = 0, s = 0;//在这里定义的k和上面的n是为了保护现场;s是一个计数器
		n = i;
		for (int j = 0; j < len2; j++)
		{
			if (str[n] == substr[k])//如果相同,在比较下一个字母
			{
				n++;
				k++;
				s++;//如果字母相同s自增一次
			}
			else//如果不相同进行下一次循环
			{
				break;
			}
		}
		if (s == len2)
		{
			sum++;//要是子字符串与原字符串相同的字母的个数等于子字符串的长度,那么这就是其中一个子字符串
		}
	}
	printf("子字符串的个数为:%d\n", sum);
	return 0;
}
用相同的思想,用指针法实现就非常容易了。
#include <stdio.h>
#include <string.h>
int main()
{
	char str[20];
	int len1, len2;
	printf("输入原字符串:");
	gets(str);
	len1 = strlen(str);
	char substr[20];
	printf("输入子字符串:");
	gets(substr);
	len2 = strlen(substr);//前面与使用下标法一样;
	char *p1, *p, *p2, *p0;//这里的*p和*p0的用法与下标法中的n,k的功能一样;
	int sum = 0;
	p1 = str;
	p2 = substr;//对p1、p2初始化分别指向原字符串和子字符串的一个字母;
	for (int i = 0; i<=len1-len2; i++)
	{
		int s = 0;
		p = p1;
		p0 = p2;
		for (int j = 0; j<len2; j++)
		{
			if (*p == *p0)//如果相同,指针后移
			{
				p++;
				p0++;
				s++;
			}
			else
			{
				break;
			}
		}
		if (s == len2)
		{
			sum++;
		}
		p1++;
		s = 0;
	}
	printf("子字符串的个数为:%d\n", sum);
	return 0;
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42080839/article/details/85007163