我在这里有一个函数来检查文本文件是否存在字符串。我现在遇到的问题是它正在检查子字符串,所以如果文件中有“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
答案 0 :(得分:2)
问题在于您假设compare
返回与find
相同的值。 compare
函数返回一个值为的整数:
0
如果字符串相等>0
如果比较字符串(在您的情况下为line
)首先按字典顺序排列<0
如果比较字符串(在您的情况下为getFriendName()
)按字典顺序排列因此,要检查完全匹配,您需要:
if(line.compare(getFriendName()) == 0) {
setExists(false);
// ...
}
将compare
与string::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
。