Antworten:
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: 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
string::nposist eine Konstante (wahrscheinlich -1), die eine Nichtposition darstellt. Es wird nach Methode zurückgegeben, findwenn das Muster nicht gefunden wurde.
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.
size_tist eine vorzeichenlose Variable, daher macht 'vorzeichenloser Wert = - 1' sie automatisch zum größtmöglichen Wert für size_t: 18446744073709551615
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.
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
...
}
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");
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.
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;
}
Der Wert von string :: npos ist 18446744073709551615. Es wird ein Wert zurückgegeben, wenn kein String gefunden wird.
18446744073709551615wäre der Wert jedoch typisch für 64-Bit std::size_t, es ist ein maximaler 64-Bit-Wert ohne Vorzeichen.