我试图验证输入字符串中是否有特定字符串,如果是,则根据找到的字符串执行某些操作; 但无论如何......它似乎总是在做第一项任务......
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)
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)
如果未找到,则返回值为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)