一般路过Laurel 2022-03-26 11:52 采纳率: 50%
浏览 124
已结题

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,不清楚是什么原因。求指教!

  • 写回答

2条回答 默认 最新

  • 魔法自动机 2022-03-26 12:25
    关注

    如果我没理解错的话,你的题目是要求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;
      }
      
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 3月26日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加