std :: string :: find在c ++中没有按预期工作

时间:2015-03-18 16:16:02

标签: c++

我正在尝试验证输入字符串中是否有特定字符串,如果是,则根据找到的字符串执行某些操作;但无论如何,它似乎总是在做第一项任务......

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;
}
它似乎有效。这是为什么?我做错了什么?

3 个答案:

答案 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;
}