我的问题是在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;
}
答案 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
。
第一次循环运行pos
是0
所以我们在搜索时从字符串b的开头开始。然后,我们将返回的值存储在pos
中。 (在我们的示例中,第一场比赛将再次为0
)
如果返回的值不是std::string::npos
我们找到了匹配项,那么我们会增加match
。对于循环的下一次迭代,我们希望在最后一次匹配后开始搜索,因此我们将pos
递增一。 (在我们的例子中,我们将它增加到1,并搜索从索引1开始的子字符串)