Was bedeutet der Ausdruck std::string::npos
im folgenden Codeausschnitt?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Was bedeutet der Ausdruck std::string::npos
im folgenden Codeausschnitt?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Es bedeutet nicht gefunden.
Es wird normalerweise so definiert:
static const size_t npos = -1;
Es ist besser, mit npos anstatt mit -1 zu vergleichen, da der Code besser lesbar ist.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
und bekomme,pos:4294967295 npos: 4294967295
wenn ich es unter Windows laufen lasse, aber auf Mac bekomme ichpos:4294967295 npos: 18446744073709551615
. Das scheint nicht richtig zu sein ... auf jeden Fall schlage ich vor,-1
stattstd::string::npos
string::npos
ist eine Konstante (wahrscheinlich-1
), die eine Nichtposition darstellt. Es wird nach Methode zurückgegeben,find
wenn das Muster nicht gefunden wurde.quelle
Das Dokument für
string::npos
sagt:quelle
size_t
ist eine vorzeichenlose Variable, daher macht 'vorzeichenloser Wert = - 1' sie automatisch zum größtmöglichen Wert fürsize_t
: 18446744073709551615quelle
std::string::npos
ist ein implementierungsdefinierter Index, der immer außerhalb der Grenzen einerstd::string
Instanz liegt. Verschiedenestd::string
Funktionen geben es zurück oder akzeptieren es, um über das Ende der Zeichenfolgensituation hinaus zu signalisieren. Es handelt sich normalerweise um einen vorzeichenlosen Integer-Typ, und sein Wert ist normalerweisestd::numeric_limits<std::string::size_type>::max ()
(dank der Standard-Integer-Aktionen) mit vergleichbar-1
.quelle
Wir müssen
string::size_type
für den Rückgabetyp der Suchfunktion verwenden, da sonst der Vergleich mitstring::npos
möglicherweise nicht funktioniert.size_type
, der durch den Allokator der Zeichenfolge definiert wird, muss einunsigned
ganzzahliger Typ sein. Der Standard-Allokator, Allokator, verwendet den Typsize_t
alssize_type
. Da-1
npos in einen vorzeichenlosen Integraltyp konvertiert wird, ist npos der maximale vorzeichenlose Wert seines Typs. Der genaue Wert hängt jedoch von der genauen Definition des Typs absize_type
. Leider unterscheiden sich diese Maximalwerte. In der Tat(unsigned long)-1
unterscheidet sich von(unsigned short)-
1, wenn die Größe der Typen unterschiedlich ist. Also der Vergleichkann false ergeben, wenn idx den Wert
-1
und idx hat undstring::npos
unterschiedliche Typen hat:Eine Möglichkeit, diesen Fehler zu vermeiden, besteht darin, zu überprüfen, ob die Suche direkt fehlschlägt:
Oft benötigen Sie jedoch den Index der übereinstimmenden Zeichenposition. Eine weitere einfache Lösung besteht darin, Ihren eigenen signierten Wert für npos zu definieren:
Jetzt sieht der Vergleich etwas anders und noch bequemer aus:
quelle
found
wirdnpos
im Falle eines Fehlers, den Teilstring in der Suchzeichenfolge nicht zu finden.quelle
Es wird von Zeichenfolgenfunktionen zurückgegeben, die Fehler anzeigen / nicht gefunden usw.
quelle
npos ist nur ein Token-Wert, der Ihnen sagt, dass find () nichts gefunden hat (wahrscheinlich -1 oder ähnliches). find () prüft auf das erste Auftreten des Parameters und gibt den Index zurück, an dem der Parameter beginnt. Beispielsweise,
quelle
statische const size_t npos = -1;
Maximalwert für size_t
npos ist ein statischer Elementkonstantenwert mit dem größtmöglichen Wert für ein Element vom Typ size_t.
Wenn dieser Wert als Wert für einen len- (oder sublen-) Parameter in den Elementfunktionen des Strings verwendet wird, bedeutet er "bis zum Ende des Strings".
Als Rückgabewert wird normalerweise verwendet, um keine Übereinstimmungen anzuzeigen.
Diese Konstante wird mit einem Wert von -1 definiert. Da size_t ein vorzeichenloser Integraltyp ist, ist er der größtmögliche darstellbare Wert für diesen Typ.
quelle
Eine Antwort für diese Tage von C ++ 17, wenn wir haben
std::optional
:Wenn Sie ein bisschen blinzeln und so tun, als würde
std::string::find()
ein zurückgegebenstd::optional<std::string::size_type>
(was es irgendwie sollte ...) - dann wird die Bedingung:quelle
Der Wert von string :: npos ist 18446744073709551615. Es wird ein Wert zurückgegeben, wenn kein String gefunden wird.
quelle
18446744073709551615
wäre der Wert jedoch typisch für 64-Bitstd::size_t
, es ist ein maximaler 64-Bit-Wert ohne Vorzeichen.