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