c++ - std::string::find 在 C++ 中无法正常工作

标签 c++

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

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/

相关文章:

c++ - VS 2015 Community Edition 项目属性 UI 中的 C/C++ 预处理器设置在哪里?

c++ - 如何将浮点值的字节存储在字符串中并随后检索该值?

c++ - 使用 QTestLib 测试文件的打开

c++ - Typeinfo 如何在多态集合中获取类的名称/ID?

c++ - 读取二进制 16 位流文件并写入 16 位 PGM (C++)

c++ - 为什么 ATOMIC_FLAG_INIT 是假的?

c++ - 如何在源文件中定义一个类并在头文件中声明它(不必使用 `class::method` 语法定义类方法)?

c++ - 将 `uint8_t`(从套接字读取)隐式转换为 `char`是否安全?

c++ - 射击子弹时 SFML 游戏速度变慢

c++ - VC++ : Form not responding during WaitForSingleObject in _tWinMain