为什么std :: string.find()不能用于“<”?

时间:2014-09-18 11:31:42

标签: c++ string macos

我有:

#include <iostream>
#include <string>

int main(int argc, const char * argv[])
{

    std::string foo = "<!";

    if (foo.find("<")) {
        std::cout<<"Found";
    }

    return 0;
}

为什么这段代码找不到"<"? 如果我将行更改为foo.find("!"),则会找到它。那么"<"会出现什么问题?

3 个答案:

答案 0 :(得分:15)

如果成功std::string::find()返回找到其参数的索引,则不是布尔值。

因为在索引0处找到"<"它返回0,并且在布尔上下文中0为假,因此条件失败。因为"!"在索引1处,它返回1,并且在布尔上下文中为真。

而不是测试find是否返回true,您需要使用:

if (foo.find("<") != std::string::npos) {

npos是保留用于表示“非职位”的特殊值,find返回它表示未找到该值。

N.B。当你想要搜索单个字符时,最好这样做,而不是搜索长度为1的字符串,即使用foo.find('<')而不是foo.find("<")

您可以尝试在字符串'<'中搜索"!<"来调试此问题,但您会发现结果与您搜索的特定字符无关,但仅限于找到字符串的位置。

答案 1 :(得分:4)

您的if语句未检查您是否正确找到了子字符串,请尝试以下操作:

if (foo.find("<") != std::string::npos)

working example

答案 2 :(得分:3)

在位置0找到“&lt;”,在此上下文中变为false

find返回找到参数的索引,如果找不到参数,则返回std::string::npos。您不会在if声明中检查该内容。