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

いくつかのコメント:

  • 使用しないでください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

たとえば、最後の char instr1と last char instr2が一致しない場合、 はanswerになります0str2の一部であってもstr1

于 2013-06-06T05:47:22.107 に答える
1

あなたが書いたアルゴリズムは、次のように答えます。

「string1 の各文字は、string2 のすべての文字と一致しますか?」

頭の中でコードをステップ実行すると、何が問題なのか、どのように修正するのかを理解できるはずです。

于 2013-06-06T05:45:03.587 に答える
1

問題はあなたのループにあります。文字列全体を 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 に答える
0
if (str1[i] != str2[j]) {
            answer = 0;
}

string1 の最初のリテラルが string2 と一致しない場合、答えが 0 に設定されます。その後、部分文字列が見つかったとしても、答えを 1 に変更していないため、適切な結果が得られません。

また、str2 インデックスをインクリメントするだけで、str1 インデックスをインクリメントしないため、文字列が見つからないため、ロジックを変更します。

于 2013-06-06T05:50:55.103 に答える