Что означает фраза std::string::npos
в следующем фрагменте кода?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Что означает фраза std::string::npos
в следующем фрагменте кода?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Значит не найдено.
Обычно это определяется так:
static const size_t npos = -1;
Лучше сравнивать с npos вместо -1, потому что код более разборчивый.
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
string::npos
- это константа (вероятно-1
), представляющая непозицию. Он возвращается методом,find
когда шаблон не найден.источник
В документе
string::npos
говорится:источник
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
тип возвращаемого значения функции поиска, иначе сравнение с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;"
Он возвращается строковыми функциями, указывающими на ошибку / не найдено и т. Д.
источник
Значение string :: npos - 18446744073709551615. Это значение возвращается, если строка не найдена.
источник
18446744073709551615
будет типичным для 64-битногоstd::size_t
, это максимальное 64-битное беззнаковое значение.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");
источник
статическая константа size_t npos = -1;
Максимальное значение для size_t
npos - это статическое значение константы члена с максимально возможным значением для элемента типа size_t.
Это значение, когда оно используется как значение параметра len (или subblen) в строковых функциях-членах, означает «до конца строки».
В качестве возвращаемого значения оно обычно используется для обозначения отсутствия совпадений.
Эта константа определяется со значением -1, которое, поскольку size_t является целочисленным типом без знака, это наибольшее возможное представимое значение для этого типа.
источник
Ответ для наших дней 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; }
источник