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: 4294967295
wenn 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, -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.
Das Dokument für string::npos
sagt:
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_t
ist eine vorzeichenlose Variable, daher macht 'vorzeichenloser Wert = - 1' sie automatisch zum größtmöglichen Wert für size_t
: 18446744073709551615
std::string::npos
ist ein implementierungsdefinierter Index, der immer außerhalb der Grenzen einer std::string
Instanz liegt. Verschiedene std::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 normalerweise std::numeric_limits<std::string::size_type>::max ()
(dank der Standard-Integer-Aktionen) mit vergleichbar -1
.
Wir müssen string::size_type
für den Rückgabetyp der Suchfunktion verwenden, da sonst der Vergleich mit string::npos
mö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_t
als size_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 ab size_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 Vergleich
idx == std::string::npos
kann false ergeben, wenn idx den Wert -1
und idx hat und string::npos
unterschiedliche 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.
18446744073709551615
wäre der Wert jedoch typisch für 64-Bit std::size_t
, es ist ein maximaler 64-Bit-Wert ohne Vorzeichen.