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

sop*_*sop 5 c++

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

if (inputString.find(str1) >= 0)
{
   //do something
}
else if (inputString.find(str2) >= 0)
{
    // do something else
}
else 
{
    std::cout << "Strange" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

// 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;
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作.这是为什么?我究竟做错了什么?

eml*_*lai 13

inputString.find(str1) >= 0 总是如此.

这是因为返回类型find就是size_t它是一个无符号的整数类型,所以它不能为负.任何体面的编译器都会对此比较发出警告.

在第二个示例中,当您将返回值转换为findto时int,如果find返回npos,则该值将变为-1.这就是为什么>= 0在那里工作.但是如果find返回的值大于INT_MAX但不是npos,则转换会将索引转换为负值,并且您的逻辑将失败.

因此,你应该比较npos:

if (inputString.find(str1) != std::string::npos)
Run Code Online (Sandbox Code Playgroud)


Nei*_*irk 7

std::string::findstd::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;
}
Run Code Online (Sandbox Code Playgroud)


chm*_*ike 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;
}
Run Code Online (Sandbox Code Playgroud)