【问题标题】:Compare part of the string比较字符串的一部分
【发布时间】:2012-06-10 23:10:38
【问题描述】:

好的,这就是我想要完成的。

首先,下表只是我创建的一个示例,在我的作业中,我不认为其中任何一个都知道。这意味着我不知道他们会通过什么以及每个字符串的长度是多少。

我正在尝试完成一项任务是能够比较字符串的一部分

   //In Array `phrase`       // in array `word`
   "Backdoor",        0        "mark"         3 (matches "Market")
   "DVD",             1        "of"           2 (matches "Get off")
   "Get off",         2        ""            -1 (no match)
   "Market",          3        "VD"           1 (matches "DVD")

从上面的代码中可以看出,左边是一组数组,我将它们存储在我的班级中,它们最多有 10 个单词

这是类定义。

class data
{
    char phrase[10][40];
public:
    int match(const char word[ ]);
};

所以我使用成员函数来访问这些私有数据。

int data::match(const char word[ ])
{
    int n,
    const int wordLength = strlen(word);

    for (n=0 ; n <= 10; n++)
    {
        if (strncmp (phrase[n],word,wordLength) == 0)
        {
            return n;
        }
    }

    return -1;
}

我试图使其工作的上述代码是它应该匹配,如果找到匹配项,则返回索引n,如果找不到则返回-1

现在发生的事情总是返回10

【问题讨论】:

  • 如果您的作业允许,您可以将std::stringstd::string::find 一起使用,或者在&lt;algorithm&gt; 中使用std::includes
  • @chris 只要我知道我的教授没有限制我们使用任何其他图书馆,但她从来没有对我们提出任何要求,而且我真的不明白使用它的方式是为什么。
  • @Jack 我希望我能实现那个。
  • @Ali 关于你之前的问题和这个问题。如果您无法获得以前的解决方案,请将代码发布到您尝试过的内容和描述以获取更多帮助。上一节课,然后把它变成两节,然后是三节,依此类推。最终你会解决你的问题,并希望对解决方案有更好的理解。谁知道你甚至可能会发现更好的方法。
  • @ali 我会为你准备答案

标签: c++ logic


【解决方案1】:

你快到了,但你的代码不完整,所以我在一些事情上摸不着头脑。

您可能有一个太多的变量来表示一个索引。除非ni 不同,否则您应该只使用一个。还可以尝试使用更具描述性的名称,pos 似乎代表了您正在搜索的文本的长度。

for (n=0 ; n <= searchLength ; n++)

由于word 的长度永远不会改变,因此您无需每次都调用strlen。在for 循环之前创建一个变量来存储长度。

const int wordLength = strlen(word);    

我假设您正在搜索的文本存储在 char 数组中。这意味着您需要将指针传递给存储在n 的第一个元素。

if (strncmp (&phrase[n],word,wordLength) == 0)

最后你会得到如下所示的内容:

char word[256] = "there";
char phrase[256] = "hello there hippie!";

const int wordLength = strlen(word);    
const int searchLength = strlen(phrase);

for (int n = 0; n <= searchLength; n++)
{
    // or phrase + n
    if (strncmp(&phrase[n], word, wordLength) == 0)
    {
        return n;
    }
}

return -1;

注意:最后一个示例现在已经完成,可以返回匹配项了。

【讨论】:

  • 这对我来说很有意义,我现在正在尝试,会给你一个快速的反馈。
  • @CaptainOblious,很抱歉在这里打扰您,但现在当我第一次尝试时,我收到了这个错误。 segment.cpp:47: error: cannot convert 'char (*)[40]' to 'const char*' for argument '1' to 'int strncmp(const char*, const char*, size_t)' 所以我假设并从 phrase 中删除了 &amp; 并编译,但它返回 10 就像没有找到一样(最大 SearchLength is 10`)
  • 实际上,wordLength 并不总是与您从我的原始帖子中看到的相同的数字,words 有时可能为空,也可能高达 4 或更少。
  • 哦,对不起,我忘了提到 phrase 是一个字符数组,但它来自类的私有部分。不确定它是否会有所不同。
  • @ali 首先包含 phraseword 的声明(例如 char phrase[256];)。
【解决方案2】:

我对你的问题感到困惑。有一些情况不清楚。例如

abcdefg --- abcde 匹配“abcde”?
匹配多少个单词?任何其他示例,
abcdefg --- dcb Match "c"?
abcdefg --- aoodeoofoo Match "a" or "adef"?
匹配的词,没关系,很简单。但如果要找到最长且不连续的字符串,那就是个大问题了。我认为你应该研究一下 LCS 问题(最长公共子序列)

【讨论】:

  • 好吧,就像preg_match,如果他们试图寻找像DVD 这样的词,如果在我的数组中我有像Where is my DVD 这样的东西,它将匹配另一个像Hello 和如果在字符串中我喜欢Hey Hello How Are you,它也会匹配。基本上所有数据都存储在二维数组中(10 个字,最多 40 个字符),例如 array[10][40];
  • 这就像完全匹配,如果他们像上面的例子一样向我发送aoodeoofoo 之类的字符串,并且在我的字符串中我有abcdef 甚至整个a-z 不被认为是匹配的.
  • 我认为目前 Ali 会很乐意得到能够返回匹配项的东西。
  • 嗯,如果短语中有“Get off”和“offline”,word中有“of”,会匹配哪一个?
  • 则不匹配。如果word 有单词off 并且在我的phraseoffline 它将匹配,但如果他们寻找Off 则不匹配,因为它也区分大小写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2011-01-10
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多