我正在尝试在字符串中找到一个字符,但是我得到了意想不到的结果。我的理解是,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
答案 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
,因为不可能是否定的。
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
,这是一个无符号整数,因此它永远不会是负数。