我想制作一个程序来搜索句子,但是我的程序只能搜索1个字符而不是整个句子。我不想使用Contains
。那么我应该从这里编辑代码的哪一部分?我认为我的循环有问题,但我无法弄清
class Readfile
{
public void readf()
{
int j;
int i = 0;
int flag = 0;
Console.WriteLine("Enter sentence : ");
string str = Console.ReadLine();
char[] c1 = str.ToCharArray();
string filename = @"C: \Users\jan31\Desktop\matthew\text.txt";
using (StreamReader sr = new StreamReader(filename))
{
string str2 = sr.ReadToEnd();
char[] fs = str2.ToCharArray();
for (i = 0; i < fs.Length; i++) //loop for file
{
if (flag == c1.Length)
{
Console.WriteLine("found");
break;
}
else
{
for (j = 0; j < c1.Length;) //loop for user string input
{
if (c1[j] == fs[i])
{
flag = flag + 1;
j++;
break;
}
else
{
flag = 0;
j = 0;
break;
}
}
}
}
}
}
}
答案 0 :(得分:2)
在第33行中,删除break
语句并添加i++
。我验证了它的工作原理。问题是,当第一个字符匹配时,您的搜索没有进展。
我建议您将这篇文章移至https://codereview.stackexchange.com/,这似乎是进行代码审查的更合适的地方。
答案 1 :(得分:1)
抛开所有使用“ contains”或RegEx的问题(两者中的任何一个都会更好,而且可能更快),循环中的问题是您不断将“ j”的值重置为零,以便递增“一世”。找到初始匹配项后,您需要同时增加主题和目标,以确定该匹配项是否适合下一个字符。
public void readf()
{
int j;
int i;
var flag = 0;
var str = "BCD";
var c1 = str.ToCharArray();
var str2 = "ABBCDEF";
var fs = str2.ToCharArray();
for (i = 0; i < fs.Length; i++) //loop for file
{
if (flag == c1.Length) // All characters in the search string where found.
{
Console.WriteLine("found");
break;
}
for (j = 0; j < c1.Length;) //loop for user string input
{
if (c1[j] == fs[i + j]) // By evaluating i + j, you don't lose your place within the file.
{
flag = flag + 1;
j++;
continue;
}
flag = 0;
break;
}
} // End file loop
Assert.AreEqual(flag, c1.Length);
}
您当然要验证自己的极端情况。
答案 2 :(得分:0)
是的,您的循环不正确。请看下面我的解决方案:
for (i = 0; i < fs.Length; i++)
{
if (c1[0] == fs[i])
{
for (var j = 1; j < c1.Length;) //loop for user string input
{
if (c1[j] != fs[i = j])
{
break;
}
}
Console.WriteLine("found");
Console.ReadLine();
return;
}
}
Console.WriteLine("not found");
Console.ReadLine();
答案 3 :(得分:0)
因此,如果要读取文件并在读取文件时查找字符串。可能您的文件很大,无法一次读取。这是我的解决方法。
class Readfile
{
public static void readf()
{
Console.WriteLine("Enter sentence : ");
string str = Console.ReadLine();
string filename = @"C: \Users\jan31\Desktop\matthew\text.txt";
Encoding fileEncoding = Encoding.Default;
bool Found = false;
using (Stream s = System.IO.File.OpenRead(filename))
{
int current;
string ReadText = "";
List<Byte> L = new List<Byte>();
do
{
current = s.ReadByte();
if (current != -1)
{
L.Add((Byte)current);
ReadText = fileEncoding.GetString(L.ToArray());
if (ReadText.Length > str.Length)
{
L.RemoveAt(0);
ReadText = fileEncoding.GetString(L.ToArray());
}
if (ReadText.Length == str.Length)
{
if (ReadText == str)
{
//Found it ##############
Found = true;
}
}
}
} while ((current != -1) && !Found);
}
if (!Found) {
//Not Found it ##############
}
}
}