我试图找出是否有一种方法可以比较字符串的内容是否是另一个字符串的开头。例如,我想知道以字符串" c"开头的字符串数,其内容是[牛仔,空气,牛,猫]。使用字符串库中的compare函数可以正常工作。问题在于,而不是尝试使用" c",我尝试使用" b"我得到了相同数量的答案。我不知道原因,是否有人建议如何解决问题?以下是我的两个版本。
#include <iostream>
#include <string>
using namespace std;
int main() {
// insert code here...
string A[4] = {"cowboy", "air", "c", "count"};
string b = "c";
int count = 0;
for(int i = 0; i < 4; i++)
{
if(b.compare(A[i]) == 0 || b.compare(A[i]) == -1)
count++;
}
cout << count << endl;
}
此部分的输出为3,这是正确的
#include <iostream>
#include <string>
using namespace std;
int main() {
// insert code here...
string A[4] = {"cowboy", "air", "c", "count"};
string b = "b";
int count = 0;
for(int i = 0; i < 4; i++)
{
if(b.compare(A[i]) == 0 || b.compare(A[i]) == -1)
count++;
}
cout << count << endl;
}
这部分的输出也是3,这是错误的。
任何帮助都会非常感激!
答案 0 :(得分:0)
您可以尝试使用find功能:
string A[4] = {"cowboy", "air", "c", "count"};
string b = "b";
int count = 0;
for(int i = 0; i < 4; i++)
{
auto found = A[i].find(b);
if(found != string::npos && found == 0)
count++;
}
cout << count << endl;
我在这里做的是在b
中找到A[i]
,如果我得到npos
这意味着如果我找到它就找不到,我会检查它是否在开始时检查found == 0
与简化类似,如果我只想在开始时检查一个字符匹配,我可以简单地A[i] == b[0]
答案 1 :(得分:0)
compare
函数的重载接受位置和长度,并且只将字符串的一部分与另一个字符串进行比较。如果你为位置传递0,并且你要搜索的字符串的大小为长度,它只会比较字符串开头的那么多字符,而不是比较整个字符。
if(A[i].compare(0, b.size(), b) == 0)
count++;
顺便说一下,你的第一次测试似乎工作的唯一原因是你基本上在检查是否&#34; c&#34;按字典顺序小于或等于目标字符串。因为&#34;牛仔&#34;,&#34; c&#34;并且&#34;计算&#34;,但不是&#34; air&#34;,你的结果是3.但是如果你添加了一个字符串,&#34; direwolf&#34;,它在&#34之后按字典顺序排列; c&#34;,但不是以&#34; c&#34;开头,你会发现你的结果不是你所期望的。
答案 2 :(得分:0)
使用以下内容替换您的if条件。这将字符串b与A [i]的第一个字符进行比较。
if(b.compare(0, A[i].length(), A[i], 0, 1) == 0)
在传递b = "c"
时,在for循环中,第一个条件满足b.compare(A[i]) == 0
,b="a"
第二个条件满足。所以在这两种情况下你都会看到3.
答案 3 :(得分:0)
您可以通过将字符串b更改为字符b然后检查数组中每个字符串的第一个字母是否等于b来轻松完成,并在它们相等时递增计数。