string.find()在使用== - 1时返回true,但在使用< 0时返回false

时间:2016-11-03 02:19:33

标签: c++ string find

我正在尝试在字符串中找到一个字符,但是我得到了意想不到的结果。我的理解是,string::find(char c)在找不到时会返回-1。但是,我得到了一些意想不到的结果。

即使该字符串不包含'8',它仍然会返回true

std::string s = "123456799";
if(s.find('8')<0)
    cout << "Not Found" << endl;
else
    cout <<  "Found" << endl;

//Output: Found

但是,使用==代替代码按预期工作时。

std::string s = "123456799";
if(s.find('8')==-1)
    cout << "Not Found" << endl;
else
    cout <<  "Found" << endl;

//Output: Not Found

2 个答案:

答案 0 :(得分:8)

  

我的理解是string::find(char c)在找不到时会返回-1

这不准确。根据{{​​3}}:

  

返回值
  如果没有,则找到子字符串或npos的第一个字符的位置   找到了这样的子串。

确切地说,如果找不到,std::string::find将返回documentation。关键是std::string::npos的类型是std::string::size_type,它是无符号整数类型。即使它是从-1的值初始化,也不是-1;它还没有签名。因此s.find('8')<0始终为false,因为不可能是否定的。

std::string::npos的文档:

static const size_type npos = -1;
     

这是一个特殊值,等于size_type类型可表示的最大值。

因此,您应该使用std::string::npos来检查结果,以避免这种混淆。

if (s.find('8') == std::string::npos)
    cout << "Not Found" << endl;
else
    cout <<  "Found" << endl;

if(s.find('8')==-1)工作正常,因为此处std::string::npos的左侧操作数是无符号的,右侧操作数是有符号的。根据{{​​3}}的规则,

  
      
  • 否则,如果无符号操作数的转换等级大于或等于带符号操作数的转换等级,则带符号操作数将转换为无符号操作数的类型。
  •   

因此-1将转换为无符号,这是std::string::npos的值,然后全部按预期工作。

答案 1 :(得分:1)

string::find()返回size_t,这是一个无符号整数,因此它永远不会是负数。