我正在尝试验证特定字符串是否在输入字符串中,如果是,则根据找到的字符串执行某些操作;但似乎无论如何它总是在做第一个任务......
if (inputString.find(str1) >= 0)
{
//do something
}
else if (inputString.find(str2) >= 0)
{
// do something else
}
else
{
std::cout << "Strange" << std::endl;
}
无论 inputString
中是否存在 str1
,它总是进入 //do something
block 。
如果我这样做
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;
}
这似乎有效。这是为什么?我做错了什么?
最佳答案
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)
关于c++ - std::string::find 在 C++ 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29127192/