1

ブルート フォース手法を使用して単純な部分文字列検索を実行しようとしていますが、表示できないエラーが発生します。私はプログラミングにかなり慣れていないので、覚えておいてください。問題は非常に単純かもしれません。

using System;
using System.Collections;
using System.Collections.Generic;

namespace SubstringSearch
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Please enter some letters: ");
            string sequence = Console.ReadLine();
            Console.Write("Enter the sequence you want to search for: ");
            string pattern = Console.ReadLine();

            Console.WriteLine(Search(pattern, pattern.Length, sequence, sequence.Length));

            Console.ReadLine();
        }

        public static int Search(string pattern, int patternLength, string sequence, int stringLength)
        {
            int i;
            int j;

            if (stringLength >= patternLength)
            {
                for (j = 0; j <= (stringLength - patternLength); j++)
                {
                    for (i = 0; i < patternLength && pattern[i] == sequence[i + j]; i++);

                    if (i >= patternLength)
                        return j;
                    else
                        return -1;
                }
            }
            else
                return -1;
        }
    }
}

そのため、1 つのエラーと 1 つの警告が表示されます。最初に、すべてのコード パスが ( Search() で) 値を返すわけではないことがわかります。理由がわかりません。次に、整数「j」が最初の for ループ (「j++」) で到達できないという警告が表示されます。

助けてください!答えは非常に単純だと思いますが、私にはわかりません。

4

4 に答える 4

2

私が知る限り、あなたが得ているエラーは、最初の「for」ループが一度も実行されなかった場合、return ステートメントにヒットしないためです。ありそうもない/不可能かもしれませんが、それでも説明する必要があります。これに対する解決策は、最後にある「else」を削除して、そこまで到達した場合に確実に「return -1」に到達するようにすることです。

于 2012-05-17T09:43:19.373 に答える
1

問題は、2 番目の for ループにあるようです。これを試して:

 if (stringLength >= patternLength)
        {
            for (j = 0; j <= (stringLength - patternLength); j++)
            {
                for (i = 0; i < patternLength && pattern[i] == sequence[i + j]; i++)
                {
                    if (i >= patternLength)
                        return j;                       
                }
            }
        }
 return -1;

これにより、すべての警告とエラーが削除され、コンパイルされます。.Contains()メソッドを使わないのはなぜですか?

含む

value パラメーターがこの文字列内にある場合、または value が空の文字列 ("") の場合は true。それ以外の場合は false。

于 2012-05-17T09:21:44.507 に答える
0

ノーリターンのコード ルートは、stringLength = patternLength の場合です。

于 2012-05-17T09:24:53.143 に答える
0

交換

Console.WriteLine(Search(pattern, pattern.Length, sequence, sequence.Length));

sequence.IndexOf(pattern);

そして、検索機能を取り除きます。フレームワークで利用できるものを(不十分に)書き直しています。

于 2012-05-17T09:51:32.777 に答える