【问题标题】:strstr not performing upto expectationsstrstr 没有达到预期
【发布时间】:2022-01-08 16:45:19
【问题描述】:

我似乎找不到我的逻辑有什么问题,strstr 没有达到我的预期

这是一个在二进制字符串中查找素数的问题,我在该字符串中找到1011,结果不是我所期望的。

对不起,如果我犯了一个可怕的愚蠢错误,我是菜鸟。

#include <stdio.h>
#include <string.h>

int main(void)
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        char str[100000];
        scanf("%s", str);
        char ten[] = "10";
        char eleven[] = "11";
        int flag = 0;
        if (strstr(str, ten) == NULL)
        {
            flag = 1;
        }
        else if (strstr(str,eleven) == NULL)
        {
            flag = 1;
        }
        if (flag == 1)
        {
            printf("NO\n");
        }
        else if (flag == 0)
        {
            printf("YES\n");
        }
    }
    return 0;
}

输入提供是

3 //test cases
1 //strings
111
101101

输出获取

NO
NO
YES

预期输出

NO
YES
YES

【问题讨论】:

  • 您提供什么输入?你期待什么输出?你得到什么输出?
  • 等待 @DavidSchwartz 让我将其添加到问题中。
  • @DavidSchwartz 完成。
  • 我很困惑。为什么您期望“111”给出“是”? “111”不包含“10”。所以第一次调用strstr 将返回NULL 导致您将flag 设置为1。如果 flag 设置为 1,您的代码将输出 NO。 (我不知道你在这行推理中哪里出错了,因为我不知道你的任何代码行应该做什么,因为它没有 cmets。我只能看到它做了什么,它显然是设计为为“111”输出“NO”。)
  • @DavidSchwartz 我认为我做错了什么,但让我解释一下我想要做什么以及我想做什么。 111 不包含 10 但之后还有另一个 else if 语句来检查 111 是否包含 11 但这有什么问题是它只会检查 10 并跳过 elseif。

标签: c


【解决方案1】:

您说您希望您的代码为“111”输出“YES”。为此,您必须将flag 保留为零。但是如果字符串不包含“10”且“111”不包含“10”,则将flag 设置为1。

【讨论】:

    【解决方案2】:

    这段代码运行良好。我已经做了一些调整,谢谢你们。

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            char str[100000];
            scanf("%s", str);
            char ten[] = "10";
            char eleven[] = "11";
            int flag = 1;
            char *one = strstr(str, ten);
            char *two = strstr(str, eleven);
            if ((one == NULL) && (two == NULL))
            {
                flag = 0;
            }
            else
            {
                flag = 1;
            }
            if (flag == 0)
            {
                printf("NO\n");
            }
            else if (flag == 1)
            {
                printf("YES\n");
            }
        }
        return 0;
    }
    

    【讨论】:

    • 抱歉,您颠倒了 01 映射。看起来不错。您还应该在scanf() 包含数字转换的任何时候检查返回,例如if (scanf("%d", &amp;t) != 1) { fputs ("error: invalid integer value.\n", stderr); return 1; }
    • 问题出在 if 语句上。如果前两个字符不是“10”,则 if 语句将在此处终止,而不检查 11 个字符。很高兴你想通了
    【解决方案3】:

    问题在于 if 语句。如果在前两个字符中没有找到“10”,它将在那里终止。也不检查 11。

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        int t;
        scanf(" %d", &t);
        while (t--)
        {
            char str[100000];
            scanf(" %s", str);
            char ten[] = "10";
            char eleven[] = "11";
            int flag = 0;
            if (strstr(str, ten) == NULL && strstr(str,eleven) == NULL)
            {
                flag = 1;
            }
            if (flag == 1)
                printf("NO\n");
            else
                printf("YES\n");
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 2016-09-05
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多