2016-11-03 3 views
4

Я пытаюсь найти символ внутри строки, но получаю неожиданные результаты. Я понимаю, что string::find(char c) возвращает -1, когда он не найден. Однако я получаю неожиданные результаты.string.find() возвращает true, когда используется == - 1, но false, когда используется <0

Даже если строка не содержит '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

[Пожалуйста, прочтите документацию] (http://en.cppreference.com/w/cpp/string/basic_string/find). Где он говорит: 'std :: string_find' возвращает' -1'? – PaulMcKenzie

+1

@PaulMcKenzie std :: string_find возвращает строку :: npos if not found, string :: npos is 'static const size_t npos = -1;' – user3196144

+1

@ user3196144 Обратите внимание, что тип 'npos' не имеет знака; он инициализируется значением «-1», не означает, что он отрицательный. Обратите внимание на объяснение [здесь] (http://en.cppreference.com/w/cpp/string/basic_string/npos): «Это специальное значение, равное максимальному значению, представляемому типом size_type». – songyuanyao

ответ

7

Мое понимание таково, что 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, а затем все работы, как и ожидалось.

1

string::find() возвращает size_t, который является беззнаковое целочисленное значение, так что никогда не может быть отрицательным.

Смежные вопросы