• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] - Co oznacza string::npos?

Object Storage Arubacloud
+2 głosów
11,609 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez xCodezaur Bywalec (2,850 p.)

Witam,

W funkcji znajdowania find, aby zwrócić prawdę jeśli zostało znalezione na pozycji trzeba użyć:

if (x!=string::npos)

Ale co dokładnie oznacza te string::npos? Dlaczego x musi być różny, a nie równy? Nurtuje mnie to pytanie, z góry dziękuję za odpowiedzi laugh

1 odpowiedź

+1 głos
odpowiedź 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 16 stycznia 2016 przez xCodezaur
1
komentarz 16 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Masz coś po Polsku ?
komentarz 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

W odniesieniu do metody find - zwrócona pozycja, gdy metoda nie znajdzie podanej frazy w tekście.

komentarz 16 stycznia 2016 przez Radfler VIP (101,030 p.)
Patrycjusz proszę, nie podawaj linków do http://www.cplusplus.com/. Jest to najgorsza strona, z której można czerpać wiedzę o C++. Lepsze jest http://en.cppreference.com ;)
komentarz 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Patrycjusz? Ja z nie korzystam i cenie w niej przejrzystość - a niby czemu jest najgorsza?
1
komentarz 16 stycznia 2016 przez Radfler VIP (101,030 p.)
Jest na niej pełno bzdur. Sam dobrze tego nie wyjaśnię, także odsyłam: http://stackoverflow.com/questions/6520052/whats-wrong-with-cplusplus-com
komentarz 16 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Czyli, że string::npos to zwrócona pozycja (czyli kiedy nie znajdzie podanej frazy w tekście), w takim razie if(x!=string::npos) to przeciwność tego, czyli znaleziona pozycja ?

Dobrze zrozumiałem ?
komentarz 16 stycznia 2016 przez adrian17 Ekspert (345,160 p.)
(Radfler, ten link ma 5 lat i z tego co sprawdzałem to każdy wspomniany w nim błąd został już dawno naprawiony. Oczywiście nie zmienia to faktu że na dłuższą metę też bardziej ufam cppreference)
1
komentarz 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

@xCodezaur Jeśli warunek dotyczy wartości różnej od std::string::npos, to znaczy, że spełni się, gdy metoda find znajdzie podaną frazę w tekście.

komentarz 16 stycznia 2016 przez Radfler VIP (101,030 p.)

Pewnie tak, ale mimo wszystko na cplusplus jest strasznie dużo głupot. Chociażby na tej stronce, którą podał Patrycjerz:

static const size_t npos = -1;

npos jest typu std::basic_string::size_type, a nie std::size_t (chociaż w większości przypadków size_type jest aliasem size_t).

komentarz 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

@Radfler Oto fragment pliku nagłówkowego c++config.h:

namespace std
{
  typedef __SIZE_TYPE__ 	size_t;
  typedef __PTRDIFF_TYPE__	ptrdiff_t;

#if __cplusplus >= 201103L
  typedef decltype(nullptr)	nullptr_t;
#endif
}

 

komentarz 16 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Patrycjerz ale ja wiem, jak powinno być aby działało, ale nie wiem dlaczego tak się robi. Chcę mniej więcej rozumieć co się dzieje w moim kodzie, a nie mieć wyklepane na pamięć wszystko :)
komentarz 16 stycznia 2016 przez adrian17 Ekspert (345,160 p.)
Nieprawda, tutaj akurat jest poprawnie. Dla szablonu basic_string:

http://www.cplusplus.com/reference/string/basic_string/npos/

Ale std::string jest instancją szablonu, której alokator ma size_type zawsze określony jako size_t, stąd na tej stronie mogli użyć size_t.

http://www.cplusplus.com/reference/string/string/npos/
komentarz 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

@xCodezaur Przecież wszystko ci wytłumaczyłem - znasz zastosowanie wartości zwracanej przez find, wiesz, kiedy std::string::npos jest zwracane, a kiedy nie, więc czego jeszcze nie rozumiesz?

komentarz 16 stycznia 2016 przez Radfler VIP (101,030 p.)

@Patrycjerz Nie rozumiem po co mi to wysłałeś, u mnie inaczej to wygląda. Mało tego: nie mam takiego pliku:

// vcruntime.h
#ifdef _WIN64
    typedef unsigned __int64 size_t;
    typedef __int64          ptrdiff_t;
    typedef __int64          intptr_t;
#else
    typedef unsigned int     size_t;
    typedef int              ptrdiff_t;
    typedef int              intptr_t;
#endif

@adrian17 A rzeczywiście, nie zauważyłem. Nie myślałem, że ktoś będzie robił osobne strony dla basic_string i string.

komentarz 16 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)

Nie rozumiem właśnie co oznacza te std::string::npos w sensie co ono mówi. Bo skoro pozycja jest znaleziona jeśli zmienna jest różna od std::string::npos. Czyli ona musi oznaczać coś w sensie "nie znalazłem pozycji" czyli by się zgadzało, że jeśli x!="nie znalazłem pozycji" to tak naprawdę znalazł pozycję. Więc na razie sobie tłumaczę string::npos jako "nie znalazłem pozycji", ale nie wiem czy jest to dobre określenie.

komentarz 16 stycznia 2016 przez adrian17 Ekspert (345,160 p.)

Mało tego: nie mam takiego pliku:

Bo obaj zaglądacie w szczegóły implementacyjne dwóch różnych bibliotek standardowych i na ich podstawie próbujecie wnioskować o standardzie :P

Więc na razie sobie tłumaczę string::npos jako "nie znalazłem pozycji", ale nie wiem czy jest to dobre określenie.

W tym kontekście, jak najbardziej. Możesz to sobie tłumaczyć na "npos == No POSition" dla ułatwienia.

komentarz 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Nie, to nie oznacza "nie znalazłem pozycji", to jest wartość, którą zwraca find, gdy nie znajdzie frazy w tekście, więc jeśli taka wartość nie występuje, to znaczy, że ta metoda daną frazę znalazła.

komentarz 16 stycznia 2016 przez adrian17 Ekspert (345,160 p.)

Nie, to nie oznacza "nie znalazłem pozycji", to jest wartość, którą zwraca find, gdy nie znajdzie frazy w tekście

...właśnie mnie poparłeś, dzięki :P

komentarz 16 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Okej już bardziej to rozumiem, ale jest jakieś tłumaczenie tego ? Coś w stylu jak to pisał adrian17 "No position". Mogę sobie to tak kojarzyć, ale wolę znać prawdziwe tłumaczenie :)
komentarz 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Chodziło mi o to, że sama wartość nie oznacza "nie znalazłem pozycji", tylko bardziej "brak pozycji", ale możesz sobie to tłumaczyć jak chcesz - to tylko moje odczucie.

A co oznacza npos? Tak jak Adrian napisał, zapewne no position.

komentarz 16 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Ok już rozumiem, dzięki za wasze odpowiedzi :)

Podobne pytania

0 głosów
2 odpowiedzi 243 wizyt
pytanie zadane 20 kwietnia 2019 w C i C++ przez Rafep Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 2,179 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez Niebieski_Zerg Użytkownik (610 p.)
0 głosów
1 odpowiedź 330 wizyt
pytanie zadane 16 stycznia 2020 w C i C++ przez AlpenGod Nowicjusz (170 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...