0

因此,如果我输入 patricia(别担心我将其转换为 toupper),该字符串将被加载到我的向量中。我的问题是关于查找功能。我倒数字符正确吗?所以如果我要输入 patricia 并且 j 将在 ABBOT,PATRICIA 逗号中的值将是 5。好吧,到目前为止我很好,但是在我找到的变量中会发生什么?

bool NameSearch::findFirstNames(vector<string> &vsFirst, string name)
{ 

int j = 0;
bool bName = false;
vsFirst.clear();

while(j < total)
{  
    int comma;
    comma = names[j].find(',');

            //Confused here
    int found = names[j].find(name, comma);

    if(found > -1)  
    {
        vsFirst.push_back(names[j]);
        bName = true;
    }

        j++;
} 

return bName;
}
4

3 回答 3

2

if (found > -1)测试可能适用于您的平台,但在技术上是可疑的。

的返回类型std::string::find()std::string::size_type,如果没有找到您要搜索的子字符串,则返回值是std::string::npos(另一方面,如果找到子字符串,则返回值是其第一次出现的字符索引)。

现在该std::string::npos值恰好是 type 的最大可能值std::string::size_type,如果这是unsigned int在您的实现中,则意味着与带符号的int的比较-1将产生true

但是,一般不能对类型做出任何假设,std::string::size_type因此,我建议将测试重写为:

if (found != std::string::npos)
{
    ...
}
于 2013-02-10T18:38:01.943 回答
1

这是误导性代码。 std::string::find()返回一个size_t,而不是一个int

int comma;
comma = names[j].find(',');

这是误导性代码。std::string::find()失败时,它返回std::string::npos,而不是-1。在您的环境中,这相当于-1巧合。

if(found > -1)  

if 语句有效地尝试通过确保没有找到结果来检查“是否找到结果std::string::npos” 。

于 2013-02-10T18:37:52.693 回答
0

还有另外两个答案,指出这段代码有什么问题,但我觉得他们都没有向你解释,作者在做什么,这就是你想要的解释。:)

我们先来看下面的代码片段。

int comma;
comma = names[j].find(',');

正如所指出的,它应该重写为:

size_t comma;
comma = names[j].find(',');

上面的代码中有 4 个find方法的重载std::string 使用了这个:

size_t find (char c, size_t pos = 0) const;

它返回索引,作为第一个参数传递的字符(在您的情况下是',')出现在字符串中,或std::string::npos​​者如果找不到该字符。显然作者确信该','字符必须存在于字符串names[j]中并且不检查结果。

在行中:

int found = names[j].find(name, comma);

再次应改写为:

size_t found = names[j].find(name, comma);

使用了以下find方法的重载:

size_t find (const string& str, size_t pos = 0) const;

这个搜索字符串以查找names[j]作为第一个参数传递的字符串的第一次出现(在您的情况下name),并返回匹配开始的索引(如果存在匹配或std::string::npos其他情况)。

如您所见,两个提到的find方法重载都有第二个参数,默认值为0. 第二个参数允许用户指定在搜索字符串中开始搜索的索引(在您的情况下names[j]

来电:

comma = names[j].find(',');

相当于调用:

comma = names[j].find(',', 0);

它的意思是:','在字符串中names[j]从头开始查找字符,并返回该字符第一次出现的索引std::string::npos,如果该字符串中没有这样的字符,则返回。

来电:

size_t found = names[j].find(name, comma);

意思是:在 string 中查找等于的子name字符串names[j],但从找到逗号的位置开始,并返回该子字符串第一次出现的索引,或者std::string::npos如果该字符串中没有这样的子字符串,则在逗号之后。

也许comma_position不是comma这个变量会是一个更好的名称。

于 2013-02-10T19:12:11.007 回答