Що означає string :: npos у цьому коді?


91

Що означає фраза std::string::nposу наступному фрагменті коду?

found = str.find(str2);

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

Відповіді:


106

Це означає, що не знайдено.

Зазвичай його визначають так:

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, і він не працював належним чином за тих умов, якими я його використовував.
Дзянн

51

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


15
+1 для фактичного показу виведення npos = no-pos, що полегшує запам'ятовування. Це настільки очевидно, що ви б про це не замислювались, як тільки дізнаєтесь про це, але хтось, хто бачить ці листи вперше, може не натиснути ...?
Тоні Делрой,

4
неправильно на 47 рівнях ... npos має size_t, це означає, що він не може бути негативним ... реальним значенням є max_index, 18446744073709551615 для 64 бітового size_t
NoSenseEtAl

25

У документі string::nposсказано:

npos - це постійне значення статичного члена з найбільшим можливим значенням для елемента типу size_t.

Як повернене значення воно зазвичай використовується для позначення відмови.

Ця константа фактично визначається зі значенням -1 (для будь-якої ознаки), яке, оскільки size_t є непідписаним цілісним типом, стає найбільшим можливим представленим значенням для цього типу.


17

size_tце беззнаковое змінна, таким чином , «значення без знака = - 1» автоматично робить його максимально можливе значення size_t: 18446744073709551615


size_t - це беззнаковий int для 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;"

Він повертається рядковими функціями, що вказують на помилку / не знайдено тощо.


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

статична const size_t npos = -1;

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

npos - це постійне значення статичного члена з найбільшим можливим значенням для елемента типу size_t.

Це значення, коли використовується як значення для параметра len (або сублін) у функціях-членах рядка, означає "до кінця рядка".

Як повернене значення воно зазвичай використовується для позначення відсутніх збігів.

Ця константа визначається зі значенням -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;
}

0

Значення string :: npos - 18446744073709551615. Його значення повертається, якщо рядок не знайдено.


Фактичне значення - це реалізація визначена і не має значення. На практиці, однак, значення 18446744073709551615було б типовим для 64-розрядних std::size_t, це максимальне 64-розрядне беззнакове значення.
Олексій Гутенєв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.