这对我来说真的很难,我该怎么办?

时间:2018-02-15 05:50:08

标签: c++

我的问题是在c ++中。如何比较两个不同长度的字符串。例如string a = "ap" string b = "apple"。所以最终的比赛应该是1,或者考虑另一个例子,让我们说string a = "123" string b = "123123123",最后的比赛应该是3.所以我想我试着让a[i]= b[i]但它只比较了一个charcater。如何比较多个长度的字符串。

int getMatchCount(string a, string b)
{
    int match = 0;

    if (a.length() == 0 or b.length() == 0 )
    {
        return -1;
    }

    for (int i = 0; i < a.length(); i++)
    {

        if( string.compare(a, b) )
        {
            match = match +1;
        }
    }
    return match;
}

2 个答案:

答案 0 :(得分:3)

这是一个天真但可行的解决方案:

#include <iostream>
#include <string>
#include <algorithm>

int main(int argc, const char * argv[]) {
    std::string first = "hello";
    std::string second = "hello_world";
    int match = 0;
    for (int i = 0; i < std::min(first.length(), second.length()); ++i) {
        if(first.at(i) == second.at(i)) {
            match++;
        } else {
            break;
        }
    }
    std::cout << match << std::endl;
    return 0;
}

因为要求:

#include <algorithm>函数存在std::min(),以避免访问无效的内存地址。也就是说,它阻止for循环访问大于string的任何string.length()索引,这将导致未定义的行为......或者在我学习C ++时返回{{1 }}

在这种情况下,它已被一些逻辑和短手三元运算符所取代。

segmentation fault

答案 1 :(得分:0)

使用std::string::find

的解决方案
#include <iostream>

int getMatchCount(std::string a, std::string b)
{
    int match = 0;
    std::size_t pos = 0;

    while ((pos = b.find(a, pos)) != std::string::npos) {
        ++pos;
        ++match;
    }

    return match;
}

int main() {
    std::cout << getMatchCount("is", "isis");
    return 0;
}

修改 我使用std::size_t,因为我想将其与std::string::npos进行比较。 int不能保证足够大以至于能够做到这一点。 std::size_t也是无符号的,这使它成为表示索引的好选择。

如果我们分解循环,它会运行b.find(a, pos),这将在字符串a中找到子串b的第一个出现。如果找到匹配项,返回值将是子字符串开始的索引,如果找不到则返回std::string::npos

第一次循环运行pos0所以我们在搜索时从字符串b的开头开始。然后,我们将返回的值存储在pos中。 (在我们的示例中,第一场比赛将再次为0

如果返回的值不是std::string::npos我们找到了匹配项,那么我们会增加match。对于循环的下一次迭代,我们希望在最后一次匹配后开始搜索,因此我们将pos递增一。 (在我们的例子中,我们将它增加到1,并搜索从索引1开始的子字符串)