编写程序,统计字符串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;
}
运行结果: