找相同字符串位置问题

编写一个程序输入两个字符串 string1 和 string2,检查在 string1 中是否包含有string2。如果有,则输出 string2 在 string1 中的起始位置;如果没有,则显示“NO”;如果 string2在 string1 中多次出现,则输出string1 中出现的次数以及每次出现的起始位置。

【算法分析】:本题需要对两个字符串进行循环,但与普通循环不同的是,这两个循环并不是同时进行的。string1 开始循环后,string2 并不一定开始循环,而是需要判断 string2 的首字母是否和 string1 中循环到的字母相同,如果相同,则两个字符串开始同时循环,并记录下开始的位置,然后判断 string2 中后面的字母是否和 string1 中的相同,相同则继续,不同则停止,直到 string2 循环完成。此时用当前的位置减去 string2 的长度就是 string2 的起始位置。在本题中,还需要注意的是,由于 string2 可能多次出现,所以需要一个数组来保存多次出现的位置。

#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
	char string1[100],string2[10];//定义两个字符串 
	char *p,*q;//遍历字符串 
	int locat[100]={0};//定义出现的位置
	int i=0,j=0,len2=0,posit=0;//len2表示字符串2的长度
	printf("请输入字符串1:");
	gets(string1);
	printf("请输入字符串2:");
	gets(string2);
	q = string2;//指针q指向字符串2的首部 
	for(j=0;*q!='\0';j++,q++)//*q表示字符串第一个字符
		len2 = j+1;//求出字符串2的长度
	p = string1;//指针p指向字符串1的首部
	q = string2;//再次初始化q指向string2的首部 
	do{
		if(*p!=*q)//字符串不相同
		{
			p++;
			posit++;
		}
		else //第一个字符相同 
		{
			while ((*q!='\0') && (*q==*p))
			{
				p++;
				q++;
				posit++;
			}
			if(*q=='\0')//第二个字符串循环结束 
			{
				locat[i]= posit - len2;
				i++; 
			} 
		}
		q = string2; 
		/*程序分析:q=string2 这句的作用是什么呢?是保证 q 循环后能再次初始化,这样才能
		进行多次判断,并且防止错误。例如:q 和 p 的第 1 个、第 2 个字符相同,但第 3 个不同,
		此时 q 指针已经指向了第 3 个字符,如果不再次初始化,下一步比较就将从 q 的第 3 个字符
		开始,出现错误。*/
	}while(*p!='\0');//字符串1的第一个字符开始往后遍历 
	printf("\n");
	printf("字符串 1:%s\n字符串 2:%s\n\n",string1,string2);
 	printf("“%s ”在“%s ”中出现 %d 次\n",string2 ,string1,i);
 	printf("起始位置分别是: ");
 	for(j=0;j<i;j++)//输出位置
 		printf("%d ",locat[j]); 
 	printf("\n"); 
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梧杵

还是学生,生活太难

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值