我真的需要帮助我的程序的最后一部分。我需要在一个更大的字符串中找到一个字符串,如果找到则返回子字符串的起始位置。从方向:
请注意,您的字符串位置从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;
temp = new char[other.Size];
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)
这一行没问题,但它需要相应的delete
声明:
temp = new char[data.Size];
然而,我怀疑这条线是否符合您的要求:
temp = data.String;
假设Mystring::String
(传统上更为Mystring::string
,但允许传递)的类型为char *
,后一行不会将data.String
中的字符复制到缓冲区temp
。相反,它丢失缓冲区,之后temp
只是其同义词,并指向同名内存为data.String
。
答案 1 :(得分:1)
编写一段代码时,首先需要的是实现算法,使用自然语言来描述它,使用笔和纸来绘制算法的进度,然后用笔和纸再次验证算法。然后,一旦你认为你有一个解决方案,编码并测试它。但实际上编程语言中的编码应该是你做的最后一件事。
在较大字符串中查找子字符串的简单算法将首先在较大字符串中搜索搜索模式中的第一个字符,然后调用该位置start
。一旦找到,并从该锚点比较每个后续位置。如果它们不匹配,则从start+1
开始搜索第一个位置的元素。如果比较成功,那么你已经完成了。如果您在任何时候到达原始字符串的末尾,则搜索将失败:
// pseudocode
start <- 0
while start <> str.size()
start <- find( str+start, pattern[0] )
if start == str.size()
break
if (compare_from( str+start, pattern ) == EQUAL)
return success(start)
if start == str.size()
return failure
现在你只需要将其转换为C ++,将复杂的子操作作为函数实现通常是一个好主意,因为这样你就可以通过小的方式处理复杂性,而不是试图一次吞下它。上面的每个操作都应该足够简单,然后整个算法就会落实到位。
答案 2 :(得分:0)
我假设这是作业,所以我不打算直接给你答案,但你现在的算法甚至都不正确。
要在另一个字符串中查找子字符串,您需要为字符串和子字符串设置独立的计数器。