c语言关于查找串s1中是否包含串s2字符的问题(vc++6.0)

问题:写函数find(char *s1 , char *s2),函数find()查找串s中是否包含词word。约定串中的词由1个或1个以上空白符分隔。

代码:

#include <stdio.h>

int find(char *s1 , char *s2)
{
int flag=1,i=0,j=0;

for (;*s1!='\0';s1++)
{if(*s1==*s2)
{for(;*s2!='\0';s1++,s2++)
if (*s1!=*s2)
flag=0;}}

if (flag==1) return 1;
else return 0;
}

int main()
{
char s1[50],s2[50];

gets(s1);
gets(s2);

if (find(s1,s2)==1)
printf("Y");
else printf("N");

return 0;
}

想法是先检测到s1和s2第一个字符重复的位置,然后s1和s2同步对比下去,直到s2走完。flag做标志。最后测试的时候只会输出Y不会输出N,不清楚是什么原因。求指教!

如果我没理解错的话,你的题目是要求s1中有无等于s2的子串。
你的代码应该是能够得出“N”的,只是你的测试样例都恰好避开了,输入“12 13”就会得到“N”。
你的代码问题:

  1. 找到s1和s2第一个字符重复的位置,不应该用s1和s2指针同步对比,这样如果对比失败,你s2指针没法回到第一个字符位置,而s1也回不到上一次字符和s2第一个字符匹配的位置。
  2. flag应该是针对“s1和s2指针同步对比”部分,所以每次*s1==*s2后都需要重置flag,只要在同步对比部分有一次子串完全相同就可以返回1了。
    int find(char *s1, char *s2)
    {
     for (; *s1 != '\0'; s1++)
     {
         if (*s1 == *s2)//遍历s1找到等于s2第一个字符的位置
         {
             int flag = 1;
             char*p1=s1,*p2 = s2;//不要直接用s1和s2,不然你遍历后s1和s2的指向都变了
             for (; *p1 != '\0'&&*p2 != '\0'; p1++, p2++)
                 if (*p1 != *p2) {//有一位不相同就可以脱离循环了,没必要再遍历浪费时间
                     flag = 0;
                     break;
                 }
             if (flag == 1&&*p2)//子串完全和s2相同,如果只是flag=1是不够的,可能p2还没遍历完
                 return 1;
         }
     }
     return 0;
    }
    

能给一下你的测试样例截图吗

我的测试是没有问题的

img

img