【问题标题】:Find method to find substring within a larger string [closed]查找在较大字符串中查找子字符串的方法[关闭]
【发布时间】:2012-06-11 02:30:00
【问题描述】:

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

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





  }

【问题讨论】:

  • 我想这是家庭作业,这就是你不使用find的原因,对吗?
  • 你是对的,这是作业,我们不允许使用实际的查找方法
  • 您应该首先描述您的算法应该如何工作,然后将其转换为指令并手动验证它们是否做了他们应该做的事情。
  • 今天有不少与字符串相关的作业题
  • 3 而一个又一个不是找到子字符串的最佳方式。

标签: c++ string find substring


【解决方案1】:

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

temp = new char[data.Size];

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

temp = data.String;

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

【讨论】:

  • 我认为temp = new char[data.Size] 实际上是一个错误。无需为查找字符串中的子字符串分配新内存。
  • @DavidRodríguez-dribeas:不,没有必要。你说的对。然而,我的回答意味着帮助 OP 发现他的误解,以便他最终能够自己得出正确的结论——这就是我回答的原因。
  • 我在想我实际上需要分配新内存来保存较大的字符串,然后在该字符串中搜索该字符串并返回起始位置。我的逻辑不正确吗?
  • @user1363061:嗯,你的逻辑本身并没有错,但大卫是对的。初级程序员会经常做您所做的事情,即制作对象的不必要的工作副本。为什么不只搜索 original 较大字符串的字符呢?真的需要副本吗?
  • @user1363061:String 中是否还没有保存较大的字符串?
【解决方案2】:

在编写一段代码时,首先需要的是一个算法来实现,用自然语言来描述它,用纸笔画出算法是如何进行的,然后用纸笔再次验证该算法。然后,一旦你认为你有一个解决方案,编码并测试它。但实际上用编程语言编码应该是你做的最后一件事。

一种在较大字符串中查找子字符串的简单算法将首先在较大字符串中搜索搜索模式中的第一个字符,称为该位置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++,将复杂的子操作实现为函数通常是一个好主意,因为这样您可以通过小口来处理复杂性,而不是试图立即吞下它。上面的每一个操作都应该简单到可以实现,然后整个算法就会到位。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 2015-09-13
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多