为什么我的程序没有打印出正确的信息?

时间:2013-06-06 05:40:00

标签: c string printing

我正在尝试编写一个程序来查看字符串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;
}

7 个答案:

答案 0 :(得分: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; 
   }
}

strpbrkstrstr是一个自动执行此操作的函数,如果这是您想要的。

你也可以试试这个:

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,而不是相反。

答案 1 :(得分:1)

您编写的算法回答如下:

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

如果你单步执行头脑中的代码,你应该能够弄清楚出了什么问题,以及如何解决它。

答案 2 :(得分:1)

几点评论:

  • 请勿使用scanf()。它没有按照你的想法做到,它甚至在没有指定字段宽度的情况下也不受保护,所以你应该期待缓冲区溢出。

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

  • 不要重新发明轮子:在C标准库中有一个名为strstr()的函数,它可以完全按照您的需要运行,并且它可以正常工作,而不像您当前的丑陋黑客 - 不可读 - 嵌套-for - 环

总而言之:

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 {}没问题。

答案 3 :(得分:1)

例如,如果str1中的最后一个字符与str2中的最后一个字符彼此不匹配,则answer将为0。即使str2str1

的一部分,也是如此

答案 4 :(得分: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

答案 5 :(得分:0)

if (str1[i] != str2[j]) {
            answer = 0;
}

如果你的string1中的第一个文字与string2不匹配,则answer设置为0,之后即使找到子字符串,你也不会将答案改为1,所以你没有得到正确的结果。

另外,你只是递增str2索引而不是用它递增str1索引,所以你永远不会找到字符串,所以改变逻辑。

答案 6 :(得分: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;
}