1

我真的需要帮助我的程序的最后一部分。我需要在更大的字符串中找到一个字符串,如果找到则返回子字符串的起始位置。从方向:

请注意,您的字符串位置从 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;
    }





  }
4

3 回答 3

1

这行没问题,虽然它想要一个相应的delete语句:

temp = new char[data.Size];

但是,我怀疑这条线是否符合您的要求:

temp = data.String;

假设Mystring::String(通常命名为Mystring::string,但让它通过)具有类型char *,后一行不会将任何字符从 复制data.String到缓冲区中temp。相反,它丢失了缓冲区,之后temp只是一个同义词,并指向与 相同的内存data.String

于 2012-06-11T02:36:57.613 回答
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++,将复杂的子操作实现为函数通常是一个好主意,因为这样您可以通过小口来处理复杂性,而不是试图立即吞下它。上面的每一个操作都应该足够简单来实现,然后整个算法就会到位。

于 2012-06-11T03:06:54.647 回答
0

我假设这是家庭作业,所以我不会直接给你答案,但你目前的算法甚至不接近正确。

要在另一个字符串中查找子字符串,您需要为字符串和子字符串设置独立的计数器。

于 2012-06-11T02:42:42.237 回答