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;
        }
    }
}

所以我收到一个错误和一个警告。首先,它告诉我并非所有代码路径都返回一个值(在 Search() 中)。我不明白为什么。其次,我收到一个警告,指出我的整数“j”在第一个 for 循环中无法访问(在“j++”处)。

请帮忙!我确定答案很简单,但我就是看不到。

4

4 回答 4

2

据我所知,你得到的错误是因为如果第一个“for”循环甚至没有运行一次,那么你就不会点击 return 语句。这可能不太可能/不可能,但您仍然必须考虑到它。解决这个问题的方法是在最后删除“else”,这样如果它走得那么远,它肯定会碰到“return -1”。

于 2012-05-17T09:43:19.373 回答
1

问题似乎在于您的第二个 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 是空字符串 (""),则为真;否则为假。

于 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 回答