Что означает string :: npos в этом коде?


97

Что означает фраза std::string::nposв следующем фрагменте кода?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;

Ответы:


110

Значит не найдено.

Обычно это определяется так:

static const size_t npos = -1;

Лучше сравнивать с npos вместо -1, потому что код более разборчивый.


3
Сравнение == -1 может заставить некоторых людей думать, что они могут преобразовать это в <0, что НЕ то же самое и не будет работать.
Энди Дент,

Просто интересно, сталкивался ли кто с этим, или это только я ... Я бегу cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;и получаю, pos:4294967295 npos: 4294967295когда запускаю его в Windows, но на Mac я получаю pos:4294967295 npos: 18446744073709551615. Это кажется неправильным ... в любом случае, я предлагаю сравнить -1вместоstd::string::npos
user1135469

@ user1135469, если вы видите ответ codaddict ниже ( stackoverflow.com/a/3827997/752842 ) или Себастьяна Рашки, я думаю, что то, что вы получаете, будет иметь смысл. И я бы рекомендовал использовать npos, потому что я пробовал использовать -1, и он не работал должным образом в тех условиях, в которых я его использовал.
Dzyann

51

string::npos- это константа (вероятно -1), представляющая непозицию. Он возвращается методом, findкогда шаблон не найден.


15
+1 за фактическое отображение вывода npos = no-pos, которое упрощает запоминание. Это настолько очевидно, что вы бы не подумали об этом, узнав об этом, но для кого-то, увидевшего эти буквы в первый раз, это может не щелкнуть ...?
Тони Делрой,

4
неверно на 47 уровнях ... npos имеет size_t, это означает, что он не может быть отрицательным ... реальное значение max_index, 18446744073709551615 для 64-битного size_t
NoSenseEtAl 04

25

В документе string::nposговорится:

npos - это статическое значение константы члена с максимально возможным значением для элемента типа size_t.

В качестве возвращаемого значения оно обычно используется для обозначения сбоя.

Эта константа фактически определяется со значением -1 (для любого признака), которое, поскольку size_t является целочисленным типом без знака, становится максимально возможным представимым значением для этого типа.


17

size_tявляется беззнаковой переменной, поэтому 'unsigned value = - 1' автоматически делает ее максимально возможным значением для size_t: 18446744073709551615


size_t - это целое число без знака для 32-битного компилятора; unsigned long long int для 64-битного компилятора. Установка его в -1 дает ему максимальное значение этого беззнакового типа.
Sudheerbb

9

std::string::npos- это индекс, определяемый реализацией, который всегда выходит за пределы любого std::stringэкземпляра. Различные std::stringфункции возвращают или принимают его, чтобы сигнализировать о конце строки. Обычно это какой-то беззнаковый целочисленный тип, и его значение обычно std::numeric_limits<std::string::size_type>::max ()(благодаря стандартным целочисленным предложениям) обычно сопоставимо с -1.


4

мы должны использовать string::size_typeтип возвращаемого значения функции поиска, иначе сравнение с string::nposможет не работать. size_type, который определяется распределителем строки, должен быть unsigned целочисленным типом. Распределитель по умолчанию, распределитель, использует тип size_tкак size_type. Поскольку -1он преобразуется в целочисленный тип без знака, npos является максимальным беззнаковым значением его типа. Однако точное значение зависит от точного определения типа size_type. К сожалению, эти максимальные значения различаются. Фактически, (unsigned long)-1отличается от (unsigned short)-1, если размер типов отличается. Таким образом, сравнение

idx == std::string::npos

может дать false, если idx имеет значение -1и idx и string::nposимеет разные типы:

std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}

Один из способов избежать этой ошибки - проверить, не завершился ли поиск напрямую:

if (s.find("hi") == std::string::npos) {
...
}

Однако часто вам нужен индекс соответствующей позиции символа. Таким образом, еще одно простое решение - определить собственное значение со знаком для npos:

const int NPOS = -1;

Теперь сравнение выглядит немного иначе и даже удобнее:

if (idx == NPOS) { // works almost always
...
}

3

foundбудет nposв случае невозможности найти подстроку в строке поиска.


1
$21.4 - "static const size_type npos = -1;"

Он возвращается строковыми функциями, указывающими на ошибку / не найдено и т. Д.


1

Значение string :: npos - 18446744073709551615. Это значение возвращается, если строка не найдена.


Фактическое значение определяется реализацией и не имеет значения. Однако на практике это значение 18446744073709551615будет типичным для 64-битного std::size_t, это максимальное 64-битное беззнаковое значение.
Алекс Гутенев

0

npos - это просто значение токена, которое говорит вам, что find () ничего не нашел (возможно, -1 или что-то в этом роде). find () проверяет первое появление параметра и возвращает индекс, с которого начинается параметр. Например,

  string name = "asad.txt";
  int i = name.find(".txt");
  //i holds the value 4 now, that's the index at which ".txt" starts
  if (i==string::npos) //if ".txt" was NOT found - in this case it was, so  this condition is false
    name.append(".txt");

Этот код не будет использовать "asad.other", потому что find () не возвращает int.
LogicMagic

0

статическая константа size_t npos = -1;

Максимальное значение для size_t

npos - это статическое значение константы члена с максимально возможным значением для элемента типа size_t.

Это значение, когда оно используется как значение параметра len (или subblen) в строковых функциях-членах, означает «до конца строки».

В качестве возвращаемого значения оно обычно используется для обозначения отсутствия совпадений.

Эта константа определяется со значением -1, которое, поскольку size_t является целочисленным типом без знака, это наибольшее возможное представимое значение для этого типа.


0

Ответ для наших дней C ++ 17, когда у нас есть std::optional:

Если вы немного прищурились и притворились, что std::string::find()возвращает std::optional<std::string::size_type>(что вроде как должно ...) - тогда условие становится:

auto position = str.find(str2);

if ( position.has_value() ) {
    std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.