在这个代码里,为什么No的情况打印不了,程序还退不出来?

我在做紫书题目的时候,做到了子序列的问题,可是我觉得我的代码卡在了奇怪的地方,当我输入本应输入No结果的时候,程序停不下来,并且还不打印我想要的“No!”。我的程序里已经把flag给打印出来了。
题目描述:输入两个字符串s和t,判断是否可以从t中删除0个或多个字符(其他字符顺序不变),得到字符串s。例如,abcde可以得到bce,但无法得到dc。
我的思路:我定义了一个flag,他是用来判断是否符合情况的。使用类似双指针的方法去一个个检查是否一样。如果检查到最后一个都检查得到的话,就让flag=1;否则就是0。这部分我觉得没什么问题。但是后面打印的时候很怪,希望得到解答,感激不尽!

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s[1000];
char t[10000];
int main(void)
{
    while (scanf("%s %s", s, t) != EOF)
    {
        int slen = strlen(s);
        int tlen = strlen(t);
        printf("slen=%d,tlen=%d\n", slen, tlen);
        int flag = 0;
        //    printf("s=%s,t=%s\n", s, t);
        int j = 0;
        for (int i = 0; i < tlen; )
        {
            for (; j < slen; )
            {
                printf("i=%d,j=%d\n", i, j);
                if (t[i] == s[j])
                {
                    if (i == (tlen - 1))
                    {
                        flag = 1;
                    }
                    i++;
                    j++;
                }
                else j++;
                printf("flag=%d\n", flag);
            }
        }
        if (flag)
        {
            printf("Yes!\n");
        }
        else
        {
            printf("No!\n");
        }
    }
    return 0;
}


``

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/692086247446166.png "#left")
这个是我想要的结果,但是。。。

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/805657247446125.png "#left")

当无法找到dc的情况下,for (int i = 0; i < tlen; ) 这里就死循环了,所以在第33行后插入一行 if(j == slen) break; ,内循环结束后都跳出,再根据flag的值做判断, 修改如下,供参考:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s[1000];
char t[10000];
int main(void)
{
    while (scanf("%s %s", s, t) != EOF)
    {
        int slen = strlen(s);
        int tlen = strlen(t);
        printf("slen=%d,tlen=%d\n", slen, tlen);
        int flag = 0;
        //    printf("s=%s,t=%s\n", s, t);
        int j = 0;
        for (int i = 0; i < tlen; )
        {
            for (; j < slen; )
            {
                printf("i=%d,j=%d\n", i, j);
                if (t[i] == s[j])
                {
                    if (i == (tlen - 1))
                    {
                        flag = 1;
                    }
                    i++;
                    j++;
                }
                else j++;
                printf("flag=%d\n", flag);
            }
            if(j == slen) break;   //修改
        }
        if (flag)
        {
            printf("Yes!\n");
        }
        else
        {
            printf("No!\n");
        }
    }
    return 0;
}

这代码可以优化下,一层循环就可以了,修改如下,供参考:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s[1000];
char t[10000];
int main(void)
{
    int i=0,j=0,flag=0;
    while (scanf("%s %s", s, t) != EOF)
    {
        int slen = strlen(s);
        int tlen = strlen(t);
        printf("slen=%d,tlen=%d\n", slen, tlen);
        for (i=0,j=0,flag=0; j < slen;)
        {
            if (t[i] == s[j])
            {
                if (i == (tlen - 1))
                {
                    flag = 1;
                }
                i++;
                j++;
            }
            else
                j++;
        }
        if (flag)
        {
            printf("Yes!\n");
        }
        else
        {
            printf("No!\n");
        }
    }
    return 0;
}

img

img