我真的需要帮助我的程序的最后一部分。我需要在一个更大的字符串中找到一个字符串,如果找到则返回子字符串的起始位置。从方向:
请注意,您的字符串位置从0开始,以长度-1结束。如果找不到该字符串,则返回值-1。
我已经开始编写以下代码了,我只是想知道这是否真的正确。我不想太过头,但我需要专家的一些反馈。我这样做了吗?或者至少我是朝着正确的方向前进的?
const int MyString::Find(const MyString& other)
{
int start(0);
int counter(0);
int end = other.Size;
int count(0);
int end1 = Size;
int nfound = -1;
char* temp;
if(other.String[0] != '\0' && other.String[0] != ' ')
{
if(other.String[count] == String[counter])
{
start = counter;
for(int i = count; i < end-1;i++)
{
for(int j = counter; j < end1 -1; j++)
{
temp[j] = String[j];
}
}
if(other == temp)
{
return start;
}
else
return nfound;
}
else{
while(other.String[count] != String[counter])
{
counter++;
if(other.String[count] == String[counter])
{
start = counter;
for(int i = count; i < end-1;i++)
{
for(int j = counter; j < end1 -1; j++)
{
temp[j] = String[j];
}
}
if(other == temp)
{
return start;
}
else
return nfound;
}
}
}
}
else
{
return nfound;
}
}
答案 0 :(得分:1)
假设您不想做任何非常复杂的事情,请考虑needle
是haystack
的子字符串,当且仅当存在子字符串的haystack
索引时从该索引开始等于needle
。
此外,您不需要复制许多子串。从您选择的索引开始,只比较逐个字符,直到(a)您发现不匹配,在这种情况下尝试另一个索引,或(b)您用尽haystack
,在这种情况下没有匹配可能是这个或任何更大的索引,或者(c)你用完needle
,在这种情况下你找到了一个匹配,所以返回你正在使用的索引。
如果有多个匹配项(例如在"na"
中搜索"banana"
),则希望路线指示您返回哪一个。这会告诉您在haystack
中考虑索引的顺序。
如果您确实想要做一些非常复杂的事情,请查看Boyer-Moore,Knuth-Morris-Pratt以及其他一些已发布的字符串搜索算法,并进行不同的权衡。发明一个好人似乎不止一个人。
答案 1 :(得分:0)
从我的角度来看,这是一个糟糕的代码。 \ *在char * -strings中用于表示字符串的结尾。在包含字符串的类中没有必要使用它。 有许多算法可以在字符串中查找子字符串,其中一种是Knuth-Morris-Pratt算法。其他内容列于本文String searching algorithm