我正在尝试验证输入字符串中是否有特定字符串,如果是,则根据找到的字符串执行某些操作;但无论如何,它似乎总是在做第一项任务......
if (inputString.find(str1) >= 0)
{
//do something
}
else if (inputString.find(str2) >= 0)
{
// do something else
}
else
{
std::cout << "Strange" << std::endl;
}
无论// do something
中是否存在str1
,它始终会进入inputString
区块。
如果我这样做
int str1pos = inputString.find(str1);
int str2pos = inputString.find(str2);
if (str1pos >= 0)
{
//do something
}
else if (str2pos >= 0)
{
// do something else
}
else
{
std::cout << "Strange" << std::endl;
}
它似乎有效。这是为什么?我做错了什么?
答案 0 :(得分:13)
inputString.find(str1) >= 0
永远是真的。
这是因为find
的返回类型是size_t
,这是无符号整数类型,因此它不能为负数。任何体面的编译器都会对此比较发出警告。
在第二个示例中,当您将find
的返回值转换为int
时,如果find
返回npos
,则该值将变为-1
。这就是>= 0
在那里工作的原因。但是,如果find
返回的值大于INT_MAX
而不是npos
,则转换会将索引转换为负值,并且您的逻辑将失败。
因此,您应该与npos
进行比较:
if (inputString.find(str1) != std::string::npos)
答案 1 :(得分:7)
std::string::find
将返回std::string::npos
。要检查字符串是否包含输入字符串,您必须使用:
if (inputString.find(str1) != std::string::npos)
{
//do something
}
else if (inputString.find(str2) != std::string::npos)
{
// do something else
}
else
{
std::cout << "Strange" << std::endl;
}
答案 2 :(得分:5)
如果未找到,则返回值为std::string::npos
。这可能是一个正数。你不知道。
将您的代码更改为
if (inputString.find(str1) != std::string::npos)
{
//do something
}
else if (inputString.find(str2) != std::string::npos)
{
// do something else
}
else
{
std::cout << "Strange" << std::endl;
}