比较字符串的一部分

时间:2012-06-10 23:10:39

标签: c++ logic

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

首先,下面的表格只是我创建的一个例子,在我的作业中,我不想知道其中任何一个。这意味着我不知道它们会传递什么以及每个字符串的长度是多少。

我正在努力完成一项任务就是能够比较部分字符串

   //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。< / p>

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

2 个答案:

答案 0 :(得分: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;

注意:最后的例子现在已经完成,直到返回一个匹配。

答案 1 :(得分:0)

我对你的问题感到困惑。有些案件不清楚。对于eaxmple

abcdefg --- abcde     Match "abcde"?
有多少单词匹配?任何其他示例,
abcdefg --- dcb     Match "c"?
abcdefg --- aoodeoofoo     Match "a" or "adef"?
如果你想找到第一个匹配的单词,那就没问题,也很简单。但如果要找到最长且不连续的弦,这是一个很大的问题。我认为你应该对LCS问题进行研究(最长公共子序列)