0

我正在尝试编写一个程序来查看字符串 1 是否是字符串 2 的一部分。在命令提示符下,我输入字符串 1,然后输入字符串 2。但问题是,无论我输入什么,我的程序都会继续打印答案是“不,字符串 1 不是字符串 2 的一部分”。我不确定我做错了什么,我的 for 循环有问题吗?帮助表示赞赏!

int string_part_of_other(void)
{
   char str1[20];
   char str2[20];
   int answer = 1;

   printf("Enter string 1:\n");
   scanf("%s", str1);

   printf("Enter string 2:\n");
   scanf("%s", str2);

   for (int i = 0; str1[i] != '\0'; i++)
   {
      for (int j = 0; str2[j] != '\0'; j++)
      {
         if (str1[i] != str2[j])
         {
            answer = 0;
         }
      }
   }

   return answer;
}

int main()
{
   int result;
   result = string_part_of_other();

   if (result == 1)
   {
      printf("Yes, string 1 is part of string 2.\n");
   }

   if (result == 0)
   {
      printf("No, string 1 is not part of string 2.\n");
   }

   return 0;
}
4

7 回答 7

1

问题出在你的循环中。您正在将整个字符串与一个字符进行比较。

for (int i = 0; str1[i] != '\0'; i++){
   for (int j = 0; str2[j] != '\0'; j++){ // here
      if (str1[i] != str2[j]) answer = 0; 
   }
}

strpbrk或者strstr是一个自动执行此操作的函数,如果您愿意的话。

你也可以试试这个:

for (int i = 0; str1[i]; i++){
    int j = 0;
    for (; str2[j] && str1[i + j]; j++){
        if (str2[j] != str1[i + j]) break;
    }
    if (!str2[j]) return 1; /*
    * This means the loop broke because it reached the end of the
    * string, not because of a mismatch. Therefore, str2 is within str1
    */
}

return 0;

另外,我认为这是您的意图string 2 is part of string 1,而不是相反。

于 2013-06-06T05:43:51.633 回答
1

您编写的算法回答以下问题:

“对于 string1 中的每个字符,它是否匹配 string2 中的每个字符?”

如果您在脑海中逐步检查代码,您应该能够弄清楚出了什么问题,以及如何解决它。

于 2013-06-06T05:45:03.587 回答
1

几点说明:

  • 不要使用scanf(). 它不会像您认为的那样做,甚至在无法指定字段宽度的情况下不受保护,因此您应该预料到缓冲区溢出。

  • 所以fgets(buf, sizeof(buf), stdin)改为使用(并注意尾随换行符)。

  • 不要重新发明轮子:strstr()在 C 标准库中调用了一个函数,它完全符合您的要求,并且它与您当前的丑陋黑客与不可读的嵌套循环不同,它可以正常工作。

总而言之:

int part_of()
{
    char buf1[LINE_MAX], buf2[LINE_MAX], *p;
    fgets(buf1, sizeof(buf1), stdin);
    fgets(buf2, sizeof(buf2), stdin);

    p = strchr(buf1, '\n');
    if (p) *p = 0;
    p = strchr(buf2, '\n');
    if (p) *p = 0;

    return strstr(buf1, buf2) != NULL;
}

另外,不要在if (func() == 1) {}之后if (func() == 0) {}立即写 - 冗余是不好的。if (func()) {} else {}很好。

于 2013-06-06T05:46:42.403 回答
1

例如,如果您的 last char instr1和 last char instr2彼此不匹配,answer则将是0. 即使str2是一部分str1

于 2013-06-06T05:47:22.107 回答
1

您只是将 str1 的所有字符与 str2 的所有字符进行比较,即使存在一个不匹配,您也将答案设置为零 .. 基于所问问题的错误逻辑我假设您想检查 str1 是否是外部循环 str2 的一部分在这种情况下应该是父字符串或包含字符串 str2 ...

    int answer=0;
    for(int i=0;str2[i]!='\0';i++) //traversing bigger string
    {
    if(str2[i]==str1[0])
    //if character of bigger string matches first  character small string
    {
    for(int j=0;str1[j]!='\0';j++)
    { 
    if(((i+j)<strlen(str2))&&(str1[j]!=str2[i+j])){
    break;}
    }//j
    if(str1[j-1]=='\0')
    {answer=1;
     break;}
    }//i
于 2013-06-06T06:28:26.213 回答
0
if (str1[i] != str2[j]) {
            answer = 0;
}

如果您的 string1 中的第一个文字与 string2 答案不匹配,则答案设置为 0,那么即使您找到子字符串,您也不会将答案更改为 1,因此您不会得到正确的结果。

此外,您只是增加 str2 索引而不是用它增加 str1 索引,因此您将永远找不到字符串,因此请更改逻辑。

于 2013-06-06T05:50:55.103 回答
0

我重写了你的一些代码:

#include <stdio.h>

int string_part_of_other(void)
{
   char str1[20];
   char str2[20];
   int answer = 0;
   int i, j, k;

   printf("Enter string 1:\n");
   scanf("%s", str1);

   printf("Enter string 2:\n");
   scanf("%s", str2);

   i = j = k =0;

   while(str2[j] !='\0')
   {
       k = j;
       for(i = 0; str1[i] != '\0' && str2[k] != '\0'; i++, k++)
       {
           if(str1[i] != str2[k])
           {
               break;
           }
       }

       if(str1[i] == '\0')
       {
           answer = 1;
       }
       j++;

   }

   return answer;
}

int main()
{
   int result;
   result = string_part_of_other();

   if (result == 1)
   {
      printf("Yes, string 1 is part of string 2.\n");
   }

   if (result == 0)
   {
      printf("No, string 1 is not part of string 2.\n");
   }

   return 0;
}
于 2013-06-06T06:12:44.397 回答