C# 简单子字符串搜索(蛮力)

C# 简单子字符串搜索(蛮力),c#,search,for-loop,substring,brute-force,C#,Search,For Loop,Substring,Brute Force,我试图使用蛮力技术进行一个简单的子字符串搜索,但是我得到了一个我看不到的错误。我对编程很陌生,所以请记住这一点。问题可能很简单 using System; using System.Collections; using System.Collections.Generic; namespace SubstringSearch { class Program { static void Main(string[] args) {

我试图使用蛮力技术进行一个简单的子字符串搜索,但是我得到了一个我看不到的错误。我对编程很陌生,所以请记住这一点。问题可能很简单

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;
        }
    }
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
命名空间子字符串搜索
{
班级计划
{
静态void Main(字符串[]参数)
{
控制台。写(“请输入一些字母:”);
字符串序列=Console.ReadLine();
Write(“输入要搜索的序列:”);
字符串模式=Console.ReadLine();
WriteLine(搜索(pattern,pattern.Length,sequence,sequence.Length));
Console.ReadLine();
}
公共静态整数搜索(字符串模式、整数模式长度、字符串序列、整数字符串长度)
{
int i;
int j;
如果(stringLength>=图案长度)
{
对于(j=0;j=patternLength)
返回j;
其他的
返回-1;
}
}
其他的
返回-1;
}
}
}
所以我得到一个错误和一个警告。首先,它告诉我并非所有代码路径都返回一个值(在Search()中)。我不明白为什么。第二,我得到一个警告,在第一个for循环中(在'j++'处)无法访问整数'j'


请帮忙!我相信答案很简单,但我就是看不出来。

问题似乎在你的第二个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;
if(stringLength>=patternLength)
{
对于(j=0;j=patternLength)
返回j;
}
}
}
返回-1;
这将删除所有警告和错误并编译。你为什么不使用这种方法

包含

如果值参数出现在此字符串中,或者 值是空字符串(“”);否则,错误


不返回的代码路径是当stringLength=patternLength时。

据我所知,您得到的错误是因为如果第一个“for”循环甚至没有运行一次,那么您就不会命中return语句。这可能不太可能/不可能,但你仍必须对此作出解释。解决这个问题的办法是删除结尾处的“else”,这样,如果它走得那么远,它肯定会碰到“return-1”。

替换

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


并且去掉你的搜索功能。您正在重写(很糟糕)框架中可用的内容。

为什么不使用标准子字符串?同时,将模式和petternLength作为参数传递也是非常难看的。标准子字符串?我们的任务是搜索字符串并找到预定义的序列。我在网上寻找了一些帮助,找到了我在这里实现的这个方法。这个方法应该有效吗?第一个for循环将只执行一次,因为第二个将始终返回。npinti-我已经尝试过了。然后它告诉我第二个循环中的“i++”是不可访问的。嘎嘎!!用户755327-我还没想到。我会检查它。@user755327:我尝试过一次,但失败了,这就是为什么我建议使用
包含
方法。@Fjun:问题是因为您的第二个for循环只执行一次,因此无法到达
I++
。我已经应用了另一个修复程序,但我真的建议您看看您正在尝试实现什么。如果你被禁止使用已经可用的函数(比如家庭作业),我真的建议你使用标准方法。为什么感谢你注意到我的代码很难看。正如我所说的,我对这一点很陌生,所以我敢肯定,从你的角度来看,这是相当丑陋的。在这里尽我最大的努力。谢谢!这使它按预期工作。真不敢相信我错过了。我知道,但我在学校,关键是我们不允许使用预定义函数。你应该说。在这种情况下,只需去掉长度参数,在函数中使用.length,并在for中声明int(int i=0;…这是C#的“标准”,如果没有多余的无用行,代码的可读性会更高。
sequence.IndexOf(pattern);