C ++匹配特定的字符串

时间:2015-12-12 00:21:52

标签: c++

我在这里有一个函数来检查文本文件是否存在字符串。我现在遇到的问题是它正在检查子字符串,所以如果文件中有“IronMan”字样,那么该字符串的任何部分都会通过检查。

这是我的函数代码:

void UIFunctions::checkIfExists()
{
    while (!fin.eof())
    {
        getline(fin, line);
        if (line.compare(getFriendName()) == string::npos)
        {
            setExists(false);
            cout << getExistsErrorPrompt() << endl << endl;
            if (listAfterCheck == 1)
            {
                listUsers();
            }
            cout << endl;
            cout << endl;
            cout << getErrorPrompt();
        }
    }
}

我搜索了解决方案并阅读了该行。比较(从行更改。查找)是我需要匹配整个字符串而不是接受子字符串(如行) .find did)现在它完全不接受通过检查。

编辑:此函数使用的文件也是如下所示:

Ironman Captain Thor

2 个答案:

答案 0 :(得分:2)

问题在于您假设compare返回与find相同的值。 compare函数返回一个值为的整数:

  • 0如果字符串相等
  • >0如果比较字符串(在您的情况下为line)首先按字典顺序排列
  • <0如果比较字符串(在您的情况下为getFriendName())按字典顺序排列

因此,要检查完全匹配,您需要:

if(line.compare(getFriendName()) == 0) {
    setExists(false);
    // ...
}

comparestring::npos的结果进行比较将永远不会触发,因为compare的幅度是两个字符串之间的第一个不同字符。

答案 1 :(得分:1)

std::basic_string::compare返回小于0,0或大于0的值。自

if (line.compare(getFriendName()) == string::npos)

看看返回是否是string::npos类型的最大值,您很可能永远不会触发if语句。如果您只想完全匹配字符串,则可以使用

if (line == getFriendName())

如果您希望找到任何以getFriendName()开头的行,那么您需要

if (line.find(getFriendName()) == 0) 

如果字符串以您想要的字符串开头,上面的find只返回0