我有:
#include <iostream>
#include <string>
int main(int argc, const char * argv[])
{
std::string foo = "<!";
if (foo.find("<")) {
std::cout<<"Found";
}
return 0;
}
为什么这段代码找不到"<"
?
如果我将行更改为foo.find("!")
,则会找到它。那么"<"
会出现什么问题?
答案 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)
答案 2 :(得分:3)
在位置0找到“&lt;”,在此上下文中变为false
。
find
返回找到参数的索引,如果找不到参数,则返回std::string::npos
。您不会在if
声明中检查该内容。