【问题标题】:std::string::find not working as expected in c++std::string::find 在 C++ 中没有按预期工作
【发布时间】:2015-03-18 16:16:01
【问题描述】:

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

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

无论str1 是否存在于inputString 中,它总是进入// do something 块。

如果我这样做

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

它似乎工作。这是为什么?我做错了什么?

【问题讨论】:

  • 无符号整数总是大于或等于零。您是否阅读了string::find 的文档?

标签: c++


【解决方案1】:

inputString.find(str1) &gt;= 0 始终为真。

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

在第二个示例中,当您将find 的返回值转换为int 时,如果find 返回npos,则该值变为-1。这就是&gt;= 0 在那里工作的原因。但是,如果find 返回的值大于INT_MAX 而不是npos,则强制转换会将索引变为负值,您的逻辑就会失败。

因此,您应该改为与npos 进行比较:

if (inputString.find(str1) != std::string::npos)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      未找到时,返回值为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;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 2012-04-12
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        相关资源
        最近更新 更多