Что означает выражение string::npos
здесь
found=str.find(str2);
if (found!=string::npos)
cout << "first 'needle' found at: " << int(found) << endl;
Что означает выражение string::npos
здесь
found=str.find(str2);
if (found!=string::npos)
cout << "first 'needle' found at: " << int(found) << endl;
Это означает, что не найден.
Обычно он определяется следующим образом:
static const size_t npos = -1;
Лучше сравнить с npos вместо -1, потому что код более разборчив.
string::npos
является константой (возможно, -1
), представляющей непозицию. Он возвращался методом find
, когда шаблон не был найден.
В документе string::npos
говорится:
npos является постоянным значением статического члена с максимально возможным значением для элемента типа size_t.
В качестве возвращаемого значения обычно используется для указания отказа.
Эта константа фактически определена со значением -1 (для любого признака), которое, поскольку size_t является неподписанным интегральным типом, становится наибольшим возможным представимым значением для этого типа.
size_t
- неподписанная переменная, поэтому "unsigned value = - 1" автоматически делает ее максимально возможной для size_t
: 18446744073709551615
std::string::npos
- это определенный индекс реализации, который всегда выходит за рамки любого экземпляра std::string
. Различные функции std::string
возвращают его или принимают его, чтобы сигнализировать о завершении строковой ситуации. Обычно это какой-то целое число без знака, и его значение обычно std::numeric_limits<std::string::size_type>::max ()
, которое (благодаря стандартным целым рекламным акциям) обычно сравнимо с -1
.
мы должны использовать string::size_type
для возвращаемого типа функции find, иначе сравнение с 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
...
}
found
будет npos
в случае отказа найти подстроку в строке поиска.
$21.4 - "static const size_type npos = -1;"
Он возвращается строковыми функциями, указывающими на ошибку/не найден и т.д.
npos - это только токен, который говорит вам, что find() ничего не нашел (возможно, -1 или что-то в этом роде). find() проверяет первое вхождение параметра и возвращает индекс, с которого начинается параметр. Например,
string name = "asad.txt";
int i = name.find(".txt");
//i holds the value 4 now, that 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");
статическая константа size_t npos = -1;
Максимальное значение для size_t
npos - это статическое постоянное значение члена с максимально возможным значением для элемента типа size_t.
Это значение, когда оно используется в качестве значения параметра len (или sublen) в строковых функциях-членах, означает "до конца строки".
В качестве возвращаемого значения оно обычно используется для указания отсутствия совпадений.
Эта константа определяется значением -1, которое, поскольку size_t является целым типом без знака, является максимально возможным представимым значением для этого типа.