Was bedeutet string :: npos in diesem Code?

91

Was bedeutet der Ausdruck std::string::nposim folgenden Codeausschnitt?

found = str.find(str2);

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

Antworten:

105

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.

Brian R. Bondy
quelle
3
Das Vergleichen von == -1 könnte auch dazu führen, dass einige Leute denken, sie könnten das in <0 umwandeln, was NICHT dasselbe ist und nicht funktioniert.
Andy Dent
Ich frage mich nur, ob jemand darauf gestoßen ist oder nur ich ... Ich renne cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;und bekomme, pos:4294967295 npos: 4294967295wenn ich es unter Windows laufen lasse, aber auf Mac bekomme ich pos:4294967295 npos: 18446744073709551615. Das scheint nicht richtig zu sein ... auf jeden Fall schlage ich vor, -1stattstd::string::npos
user1135469
@ user1135469 Wenn Sie die Antwort von codaddict bellow ( stackoverflow.com/a/3827997/752842 ) oder von Sebastian Raschka sehen, denke ich, dass das, was Sie bekommen, Sinn macht. Und ich würde die Verwendung von npos empfehlen, da ich versucht habe, -1 zu verwenden, und es unter den Bedingungen, unter denen ich es verwendet habe, nicht richtig funktioniert hat.
Dzyann
51

string::nposist eine Konstante (wahrscheinlich -1), die eine Nichtposition darstellt. Es wird nach Methode zurückgegeben, findwenn das Muster nicht gefunden wurde.

Sheldon L. Cooper
quelle
15
+1 für die tatsächliche Anzeige der Ableitung npos = no-pos, die das Erinnern erleichtert. Es ist so offensichtlich, dass Sie nicht darüber nachdenken würden, wenn Sie es einmal gewusst hätten, aber für jemanden, der diese Buchstaben zum ersten Mal sieht, klickt es möglicherweise nicht ...?
Tony Delroy
4
falsch auf 47 Ebenen ... npos ist von size_t, es bedeutet, dass es nicht negativ sein kann ... wahre Bedeutung ist max_index, 18446744073709551615 für 64 Bit size_t
NoSenseEtAl
25

Das Dokument für string::npossagt:

npos ist ein statischer Elementkonstantenwert mit dem größtmöglichen Wert für ein Element vom Typ size_t.

Als Rückgabewert wird er normalerweise verwendet, um einen Fehler anzuzeigen.

Diese Konstante wird tatsächlich mit einem Wert von -1 (für jedes Merkmal) definiert, der, da size_t ein vorzeichenloser Integraltyp ist, der größtmögliche darstellbare Wert für diesen Typ wird.

Codaddict
quelle
17

size_tist eine vorzeichenlose Variable, daher macht 'vorzeichenloser Wert = - 1' sie automatisch zum größtmöglichen Wert für size_t: 18446744073709551615


quelle
size_t ist int für 32-Bit-Compiler ohne Vorzeichen; unsigned long long int für 64-Bit-Compiler. Wenn Sie den Wert auf -1 setzen, hat er den Maximalwert dieses vorzeichenlosen Typs.
Sudheerbb
9

std::string::nposist ein implementierungsdefinierter Index, der immer außerhalb der Grenzen einer std::stringInstanz liegt. Verschiedene std::stringFunktionen 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 normalerweise std::numeric_limits<std::string::size_type>::max ()(dank der Standard-Integer-Aktionen) mit vergleichbar -1.

wilx
quelle
4

Wir müssen string::size_typefür den Rückgabetyp der Suchfunktion verwenden, da sonst der Vergleich mit string::nposmöglicherweise nicht funktioniert. size_type, der durch den Allokator der Zeichenfolge definiert wird, muss ein unsigned ganzzahliger Typ sein. Der Standard-Allokator, Allokator, verwendet den Typ size_tals size_type. Da -1npos 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 ab size_type. Leider unterscheiden sich diese Maximalwerte. In der Tat (unsigned long)-1unterscheidet sich von (unsigned short)-1, wenn die Größe der Typen unterschiedlich ist. Also der Vergleich

idx == std::string::npos

kann false ergeben, wenn idx den Wert -1und idx hat und string::nposunterschiedliche Typen hat:

std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}

Eine Möglichkeit, diesen Fehler zu vermeiden, besteht darin, zu überprüfen, ob die Suche direkt fehlschlägt:

if (s.find("hi") == std::string::npos) {
...
}

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:

const int NPOS = -1;

Jetzt sieht der Vergleich etwas anders und noch bequemer aus:

if (idx == NPOS) { // works almost always
...
}
Debashish
quelle
3

foundwird nposim Falle eines Fehlers, den Teilstring in der Suchzeichenfolge nicht zu finden.

Raghuram
quelle
1
$21.4 - "static const size_type npos = -1;"

Es wird von Zeichenfolgenfunktionen zurückgegeben, die Fehler anzeigen / nicht gefunden usw.

Chubsdad
quelle
0

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,

  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_nitp
quelle
Dieser Code wird nicht für "asad.other" verwendet, da find () kein int zurückgibt.
LogicMagic
0

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.

Leninkumar
quelle
0

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ückgegeben std::optional<std::string::size_type>(was es irgendwie sollte ...) - dann wird die Bedingung:

auto position = str.find(str2);

if ( position.has_value() ) {
    std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
einpoklum
quelle
0

Der Wert von string :: npos ist 18446744073709551615. Es wird ein Wert zurückgegeben, wenn kein String gefunden wird.

Ayush ShaZz
quelle
Der tatsächliche Wert ist implementierungsdefiniert und irrelevant. In der Praxis 18446744073709551615wäre der Wert jedoch typisch für 64-Bit std::size_t, es ist ein maximaler 64-Bit-Wert ohne Vorzeichen.
Alex Guteniev