我试图找出是否有一种方法来比较一个字符串的内容是否是另一个字符串的开始。例如,我想知道以字符串"c“开头的字符串的数量,该数组的内容是牛仔、空气、奶牛、猫。使用字符串库中的比较函数可以很好地工作。问题是,当我没有尝试使用"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,这是错误的。
任何帮助都是非常感谢的!
发布于 2017-10-13 04:41:38
compare函数存在过载,它接受位置和长度,并且只将字符串的一部分与另一个字符串进行比较。如果您以0作为位置,并且您正在搜索的字符串的大小作为长度,它将只比较字符串开头的那几个字符,而不是比较整个字符串。
if(A[i].compare(0, b.size(), b) == 0)
count++;顺便说一下,您的第一个测试似乎有效的唯一原因是,您基本上是在检查"c“在字典上是否小于或等于您的目标字符串。既然“牛仔”、"c“和”计数“是这样的,而不是"air",那么你的结果是3。但是如果你添加了一个字符串,比如"direwolf”(按字典顺序排在"c“之后,而不是以"c”开头),你会发现你的结果并不是你所期望的那样。
发布于 2017-10-13 04:39:41
您可以尝试使用发现函数:
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;我在这里做的是在A[i]中找到A[i],如果我得到了npos --这意味着如果我找到了它就找不到了,我会通过检查found == 0来检查它是否在开始时
同样地,为了简化,如果我只想在开头检查一个字符匹配,我可以简单地A[i] == b[0]
现场演示
发布于 2017-10-13 04:56:03
将您的if条件替换为以下内容。这将字符串b与Ai的第一个字符进行比较。
if(b.compare(0, A[i].length(), A[i], 0, 1) == 0)在for循环中,当传入b = "c"时,第一个条件满足b.compare(A[i]) == 0,对于b="a",第二个条件满足。因此,在这两种情况下,你会看到3。
https://stackoverflow.com/questions/46722527
复制相似问题