Мое понимание таково, что string::find(char c)
возвращает -1
, когда он не найден.
Это неточно. Согласно documentation:
Возвращаемое значение
Позиция первого символа найденной подстроки или НСС, если не такая подстрока не найдена.
Так, чтобы быть точным, когда не найден std::string::find
вернется std::string::npos. Дело в том, что тип 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)
работает отлично, потому что левый операнд в operator== здесь без знака, правая один подписан. Согласно правилам для arithmetic operators,
- В противном случае, если ранг преобразования без знака операнда больше или равно преобразования ранга подписанного операнда, подписанный операнд преобразуется в тип без знака операнда.
Так -1
будут преобразованы в беззнаковое, что значение std::string::npos
, а затем все работы, как и ожидалось.
[Пожалуйста, прочтите документацию] (http://en.cppreference.com/w/cpp/string/basic_string/find). Где он говорит: 'std :: string_find' возвращает' -1'? – PaulMcKenzie
@PaulMcKenzie std :: string_find возвращает строку :: npos if not found, string :: npos is 'static const size_t npos = -1;' – user3196144
@ user3196144 Обратите внимание, что тип 'npos' не имеет знака; он инициализируется значением «-1», не означает, что он отрицательный. Обратите внимание на объяснение [здесь] (http://en.cppreference.com/w/cpp/string/basic_string/npos): «Это специальное значение, равное максимальному значению, представляемому типом size_type». – songyuanyao