编写一个程序输入两个字符串 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;
}